如果在 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 中满足条件,则从前一行获取值并连接的主要内容,如果未能解决你的问题,请参考以下文章