改进我的编码" for loop"

时间:2017-07-27 09:54:34

标签: r for-loop if-statement

以下是在检查特定条件后(如果连续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

2 个答案:

答案 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