根据特定值在列中创建累积总和

时间:2017-05-18 09:45:26

标签: r function sum

我有如下所示的数据

 field_pointpath                             value  value1
C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACTACC    19530   0
C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACTACC    19540   #N/A
C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACTACC    19545   #N/A
C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACTACC    19550   #N/A
C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACTACC    19570   #N/A
C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACTACC    15943   0
C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACTACC    15944   #N/A
C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACTACC    15945   #N/A
C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACTACC    15950   #N/A
C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACTACC    15955   #N/A
C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACTACC    15960   #N/A

我想在R中创建一个函数,以便在field_pointpath中标识特定变量并计算列value1

例如:列field_pointpath 'C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACTACC'

中的所有重复值
value1 = (19540-19530)+0

等等'C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACTACC'结束,而'C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACTACC'则应该重新开始

所以答案应该是

   field_pointpath                         value    value1
C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACTACC    19530   0
C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACTACC    19540   10
C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACTACC    19545   15
C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACTACC    19550   20
C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACTACC    19570   40
C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACTACC    15943   0
C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACTACC    15944   1
C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACTACC    15945   2
C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACTACC    15950   7
C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACTACC    15955   12
C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACTACC    15960   17

我希望我能够正确解释我的问题 请各位成员帮忙。

2 个答案:

答案 0 :(得分:0)

我们可以使用data.table执行此操作。将'data.frame'转换为'data.table'(setDT(df1)),按逻辑向量(value1==0)或field_pointpath的累积总和进行分组,得到值的差异,将其与0连接并获得累积和

library(data.table)
setDT(df1)[, valueN := cumsum(c(0, diff(value))), cumsum(value1==0)]
#setDT(df1)[, valueN := cumsum(c(0, diff(value))), field_pointpath]
df1
#                             field_pointpath value value1 valueN
# 1: C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACTACC 19530      0      0
# 2: C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACTACC 19540   #N/A     10
# 3: C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACTACC 19545   #N/A     15
# 4: C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACTACC 19550   #N/A     20
# 5: C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACTACC 19570   #N/A     40
# 6: C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACTACC 15943      0      0
# 7: C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACTACC 15944   #N/A      1
# 8: C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACTACC 15945   #N/A      2
# 9: C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACTACC 15950   #N/A      7
#10: C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACTACC 15955   #N/A     12
#11: C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACTACC 15960   #N/A     17

答案 1 :(得分:0)

下面说明了在基础R中执行此操作而无需其他程序包的方法。首先,我创建一些看起来像你的问题的玩具数据。

# Create toy data
dat <- data.frame(ID = LETTERS[rep(1:2, c(4,6))], col1 = 1:10+9000, col2 = NA)
dat$col2[c(1, 5)] <- 0
print(dat)
#   ID col1 col2
#1   A 9001    0
#2   A 9002   NA
#3   A 9003   NA
#4   A 9004   NA
#5   B 9005    0
#6   B 9006   NA
#7   B 9007   NA
#8   B 9008   NA
#9   B 9009   NA
#10  B 9010   NA

覆盖col2列:

dat$col2 <- do.call(c, tapply(dat$col1, dat$ID, FUN=function(x) cumsum(c(0, diff(x)))))
print(dat)
#   ID col1 col2
#1   A 9001    0
#2   A 9002    1
#3   A 9003    2
#4   A 9004    3
#5   B 9005    0
#6   B 9006    1
#7   B 9007    2
#8   B 9008    3
#9   B 9009    4
#10  B 9010    5