如何使用dplyr或类似的R包对数据帧进行渐进操作?

时间:2018-07-11 00:39:35

标签: r dataframe dplyr data.table mutate

我有这个数据框:

df <- data.frame(a = c(1,2,3,4,5),
                 b = c(6,5,4,6,1))

我需要创建一个'c'列,将'a'的第i个元素与'b'的第(i + 1)个元素进行求和并将其存储在'c'的第i个位置,而'c'的最后一个元素将等于其对应的'a'值的值。 在for循环中,代码将如下所示:

#Initialize the 'c' column
df$c <- vector("double", nrow(df))

#For Loop
for(i in (1:(nrow(df)-1)){
 df$c[i] <- df$a[i] + df$b[i+1]
}
df$c[nrow(df)] <- df$a[nrow(df)]

我对dplyr :: mutate()很熟悉,但是我不知道如何用该函数替换该循环。 dplyr或其他软件包中是否还有其他功能可以帮助我完成此类操作?

2 个答案:

答案 0 :(得分:2)

lead()中使用dplyr

df %>%
    mutate(c = a + lead(b, default = 0))

答案 1 :(得分:1)

您可以使用data.table::shift将b列加到a:

dt[, C := ifelse(is.na(shift(b, type="lead")), a, a + shift(b, type="lead"))][]

或使用replace处理尾部情况:

dt[, C := {
        x <- shift(b, type="lead")
        a + replace(x, is.na(x), 0)
    }]

省略了fill中的shift自变量(即等同于default中的dplyr::lead

df[, C := a + shift(b, fill=0, type="lead")]

数据:

library(data.table)

dt <- data.table(a = c(1,2,3,4,5),
                 b = c(6,5,4,6,1))