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

时间:2017-04-21 10:22:57

标签: r dataframe data-manipulation

我有一个数据帧

> 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),第三和(3,5,8)等的总和( res <的第一行和最后一行/ em>无所谓,我暂时把它设为NA)

我怎样才能在R中完成它?

4 个答案:

答案 0 :(得分:1)

如果您使用data.table

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

答案 1 :(得分: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

答案 2 :(得分:0)

function removeProduct(product) {
  clearInterval(undoTimeoutId);
  cartList.find('.deleted').remove();
  var topPosition = product.offset().top - cartBody.children('ul').offset().top, 
    productQuantity = Number(product.find('.quantity').find('input').val()),
    productTotPrice = Number(product.find('.price').text().replace('€', ''));
}

答案 3 :(得分:0)

使用头部和尾部:

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)