我有这个数据框:
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或其他软件包中是否还有其他功能可以帮助我完成此类操作?
答案 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))