下面是一个简单的循环,用于在检查特定条件后(如果两个连续行具有相同的值)在数据框中插入新列。 该代码工作得很好,但我想提高我的编码技能,所以我要求替代解决方案(更快、更优雅)。 我查看了之前有关该主题的帖子并学到了很多东西,但我对我的具体案例感到好奇。 感谢您的任何意见。
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 中的许多事情,您不需要 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])
关于r - 改进我的编码 "for loop",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45347293/