基于另一列的多行创建新列

3
我有一个数据框,如下所示:
> df<-data.frame(index=c(1,2,3,4,5,6),value=c(2,3,5,8,11,12))
> df
    index value
1     1     2
2     2     3
3     3     5
4     4     8
5     5    11
6     6    12

我想创建一个新列,它等于由index所引用的value列中相邻三个值的和,也就是说:

> df_res
  index value res
1     1     2 NA
2     2     3 10
3     3     5 16
4     4     8 24
5     5    11 31
6     6    12 NA
< p > res的第二行是(2,3,5)的和,第三行是(3,5,8)的和等等。(第一行和最后一行不重要,并且我暂时将其设置为NA)

如何在R中完成这个任务?


可能是R dplyr rolling sum的重复问题。 - Aramis7d
4个回答

1
如果您使用 data.table:
library(data.table)
setDT(df)
df[,res:=value+shift(value,1)+shift(value,1,type="lead")]

1
你可以使用 dplyrroll_sum 来进行:
df %>% 
  mutate(v2 = roll_sum(value, 3,fill = NA))

这句话的意思是:

  index value v2
1     1     2 NA
2     2     3 10
3     3     5 16
4     4     8 24
5     5    11 31
6     6    12 NA

0
df$res <- sapply(df$index, function(index) 
    ifelse(index > 1 & index < nrow(df),sum(df$value[(index - 1):(index + 1)]), NA))

   index value res
1     1     2  NA
2     2     3  10
3     3     5  16
4     4     8  24
5     5    11  31
6     6    12  NA

嗨,我想知道为什么 df$res <- sapply(df$index, function(index) (sum(df$value[index - 1:index+1]))) 不会给出相同的结果?问题在于我想简化这三个 df$value 项的相加,因为我有超过3个项目。 - Ding Li
@DingLi 应该比较 2-1:4-2(2-1):(4-2) - zx8754
我已经编辑了代码,使其更加灵活。 - Jeremy Voisey

0

使用head和tail:

df$res <- df$value + c(tail(df$value, -1), NA) + c(NA, head(df$value, -1))

df
#   index value res
# 1     1     2  NA
# 2     2     3  10
# 3     3     5  16
# 4     4     8  24
# 5     5    11  31
# 6     6    12  NA

或者使用zoo:

df$res <- zoo::rollsum(df$value, 3, na.pad = TRUE)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接