【问题标题】:Create a new column based multiple rows of another column基于另一列的多行创建新列
【发布时间】:2017-04-21 10:22:56
【问题描述】:

我有一个这样的数据框

> 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

res的第二行是(2,3,5),第三个sum(3,5,8)等的总和(res没关系,我暂时设置为NA)

如何在 R 中完成它?

【问题讨论】:

标签: r dataframe data-manipulation


【解决方案1】:

如果你使用data.table

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

【讨论】:

    【解决方案2】:

    你可以使用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
    

    【讨论】:

      【解决方案3】:

      使用头部和尾部:

      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
      

      或者使用动物园:

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

      【讨论】:

        【解决方案4】:
        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
        • @DingLi 应该,比较2-1:4-2 vs (2-1):(4-2)
        • 我已经编辑了代码,使其更加灵活。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多