如果在 R 中满足条件,则从前一行获取值并连接

Posted

技术标签:

【中文标题】如果在 R 中满足条件,则从前一行获取值并连接【英文标题】:Fetch value from previous row and concatenate if condition is met in R 【发布时间】:2014-09-25 12:16:46 【问题描述】:

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

条件:如果 'Flag' 为 1,则在从 AG 列中的前一行获取字符串并从 AG 列中获取当前行字符串之后进行连接。

我的数据框示例在此下方给出,所需结果在“期望结果”列中给出

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

我意识到我的代码是错误的,但即使经过多次尝试和错误,我也无法找到解决方案。 提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

这是使用包dplyr 中的?lag 函数的一个选项(我还使用with 来减少输入mydata 几次并将逻辑测试减少到仅Flag,因为0 和1 被自动解释为逻辑值):

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::,但我将其留在那里,以免与 stats::lag 混淆。

【讨论】:

效果很好!非常感谢您提供详细信息!【参考方案2】:

假设您的表名为 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。我将使用 for 一个巨大的数据集(100 万行) 在这种情况下是否推荐使用 for 循环?谢谢! 使用@beggineR 发布的解决方案可能会更好。它看起来是一种不错的矢量化方法。

以上是关于如果在 R 中满足条件,则从前一行获取值并连接的主要内容,如果未能解决你的问题,请参考以下文章

excel满足多个条件后返回固定值并求和怎么用函数实现?

如果在 R 中满足某些行和列之间的条件,则确定一个值

查找最大同时出现次数,如果满足条件则增加变量

在 R 中满足条件时跳过一行代码

如果满足 for 循环中的条件,则在同一行中的其他单元格中获取值

R重复功能直到满足条件