以下是在检查特定条件后(如果连续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
答案 0 :(得分:3)
对于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])
答案 1 :(得分:2)
你可以在一行中做到这一点......
library(dplyr) #for the 'lead' function
dat = data.frame(Label1=c("A","B","B","C","C","C","D"),stringsAsFactors = F)
dat$vector <- as.numeric(dat$Label1!=lead(dat$Label1,default = ""))
dat
Label1 vector
1 A 1
2 B 0
3 B 1
4 C 0
5 C 0
6 C 1
7 D 1