从前一行获取值并在R中满足条件时连接

时间:2014-09-25 12:16:46

标签: r concatenation conditional-statements

我想从前一行获取字符串,如果从另一列满足条件,则与当前行字符串连接

条件:如果'标记'在从AG列中的上一行获取字符串并从AG列中获取当前行字符串之后,它是1连接。

我的数据框样本在下面给出,所需的结果在"期望的结果"中给出。柱

AG       Flag   Desired result
Team a   0  
Team b   0  
CI       0  
Team a   1      CI to Team a
Team b   0  
Team b   0  
C        0  
CI       1      C to CI
Team a   0  
Team b   1      Team a to Team b

我的代码是

mydata$trans <- ifelse(mydata$Flag == 1,paste(mydata$AG[-1],"to",mydata$AG[-nrow(mydata)]),"")

我得到了以下结果:

AG       Flag   trans
Team a   0  
Team b   0  
CI       0  
Team a   1      Team b to Team a
Team b   0  
Team b   0  
C        0  
CI       1      Team a to CI
Team a   0  
Team b   0 
C        0      
CI       1      Team a to CI
Team a   0      
Team b   1      Team b to Team a

我意识到我的代码是错误的,但即使经过多次反复试验,我也无法找到解决方案。 在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

假设您的表名为x,这是一个执行您想要的for循环。

x$trans <- NA
for (i in 2:nrow(x)) {
   if (x[i, 2] == 1) {
      x[i, 3] <- paste(x[i - 1, 1], "to", x[i, 1])
   }
}

我在第二个索引处启动循环,因为我不确定如何处理第一行Flag为1的情况。你可以轻松地单独处理这种特殊情况,甚至可以修改循环。

答案 1 :(得分:0)

这是使用程序包?lagdplyr函数的一个选项(我还使用with多次减少键入mydata并将逻辑测试减少到{{1}因为0和1自动被解释为逻辑值):

Flag

你可以省略require(dplyr) mydata$trans <- with(mydata, ifelse(Flag, paste(dplyr::lag(AG,1), "to", AG), "")) #mydata # AG Flag trans #1 Team_a 0 #2 Team_b 0 #3 CI 0 #4 Team_a 1 CI to Team_a #5 Team_b 0 #6 Team_b 0 #7 C 0 #8 CI 1 C to CI #9 Team_a 0 #10 Team_b 1 Team_a to Team_b ,但我把它留在那里,所以它不会与dplyr::混淆。