我想要做的是,如果列b中的行等于2,那么我想在列a中的前一行的值中添加3。如果条件不满足,那么我不希望前一行值改变。当我尝试这个代码但是R正在添加到后续行。并且我替换-1行引用并不重要,它总是添加到后续行。
df$a[-1] <- ifelse(df$b == 2, df$a[-1] + 3, df$a[-1])
Have Want
a b a b
0 1 0 1
1 3 4 3
2 2 2 2
2 4 2 4
4 5 4 5
答案 0 :(得分:5)
另一种方法
df <- data.frame(a=c(0, 1, 2, 2, 3),
b=c(1, 3, 2, 4, 4))
df$a[c(df$b[-1], 0) == 2] <- df$a[c(df$b[-1], 0) == 2] + 3
答案 1 :(得分:3)
一个解决方案:
我发现最简单的方法就是直接使用向量,如下所示:
df$a <- df$a + c((df$b[-1] == 2) * 3, 0)
您的代码存在问题:
您将在语句中获得后续行,因为第一个参数df$b==2
的每个元素都与df$a
的下一行匹配。让我们看一下你问题中的例子来说明:
df <- data.frame(a=c(0,1,2,2,4), b=c(1,3,2,4,5)) # As in your question
此处,df$b==2
相当于c(FALSE, FALSE, TRUE, FALSE, FALSE)
。
df$a[-1]
是df$a
的所有元素,除了第一个,即等同于c(1,2,2,4)
。由于参数长度不同,df$a[-1]
的第一个元素会重复/循环,如c(1,2,2,4,1)
。
因此,在您的语句中,df$b==2
的第一个元素与df$a[-1]
的第一个元素或df$a
的第二个元素(即后续行)匹配,并且df$b==2
的第二个元素与df$a
等的第三个元素匹配。
在此示例中,您的代码将提供以下输出:
ifelse(df$b==2, df$a[-1]+3, df$a[-1])
# Output: 1 2 5 4 1
调整代码的方法:
因为您要将df$b
的第二个元素与df$a
的第一个元素进行比较,依此类推,您可以按如下方式调整代码:
df$a[-nrow(df)] <- ifelse(df$b[-1]==2, df$a+3, df$a)
如果我的任何解释都不清楚,请随时发表评论,我会尽力帮助!