如果满足条件,如何向上一行添加值

时间:2017-01-01 22:06:21

标签: r if-statement row

我想要做的是,如果列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

2 个答案:

答案 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)

如果我的任何解释都不清楚,请随时发表评论,我会尽力帮助!