【问题标题】:Improve my coding "for loop"改进我的编码“for循环”
【发布时间】:2017-07-27 09:54:34
【问题描述】:

以下是一个简单的循环,用于在检查特定条件后在数据框中插入新列(如果 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 for-loop if-statement


    【解决方案1】:

    对于 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])
    

    【讨论】:

    • NA 应该在底部而不是顶部(循环从 1 开始,它正在搜索下一个元素而不是前一个元素)。
    • dat$Label1==c(tail(dat$Label1,-1),NA) 作为同一方法的不同概念化
    • 谢谢 nicola,调整了答案。
    • 当然是编码偏好,不过最好把=换成&lt;-
    • thanks @zx8754 修改了答案以符合 OP 问题中的符号。
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2018-11-20
      • 2016-05-09
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多