以下是一个简单的循环,用于在检查特定条件(如果2个连续的行具有相同的值)之后在数据帧中插入新列。
代码可以正常工作,但是我想提高自己的编码技能,所以我要求替代解决方案(更快,更优雅)。
我检查了有关该主题的先前主题并学到了很多东西,但是我对自己的具体情况感到好奇。
感谢您的任何投入。
vector<-1
vector_tot<-NULL
for(i in 1:length(dat$Label1))
{
vector_tot<-c(vector_tot,vector)
if(dat$Label1[i]==dat$Label1[i+1]){
vector<-0
}
else {
vector<-1
}
}
dat$vector<- vector_tot
最佳答案
对于R中的许多内容,由于函数是 vector 化的,因此不需要for循环。因此,我们可以实现您想要的:
# sample data
dat <- data.frame(Label1=c("A","B","B","C","C","C","D"),stringsAsFactors = F)
# first create a vector that contains the previous value
dat$next_element <- c(dat$Label1[2:nrow(dat)],"")
# then check if they match
dat$vector <- as.numeric(dat$Label1==dat$next_element)
输出:
Label1 next_element vector
1 A B 0
2 B B 1
3 B C 0
4 C C 1
5 C C 1
6 C D 0
7 D 0
它也可以一行完成,但是我认为上面的例子更好地说明了它的工作方式:
dat$vector <- dat$Label1==c(dat$Label1[2:nrow(dat)],"")
或与上一个元素进行比较:
dat$vector <- dat$Label1==c("",dat$Label1[1:nrow(dat)-1])