我有如下所示的数据
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
我希望我能够正确解释我的问题 请各位成员帮忙。
答案 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