我有一个数据集,显示在每个阶段(ST,A,B,C,D,结束)的时间
数据:
zz <- "ID ST A B C D End
GX001 0 0 438 0 0 520
GX002 0 182 0 0 198 331
GX003 0 0 0 92 118 118
GX004 0 0 0 0 0 218
GX005 0 24 145 0 151 159
GX006 0 0 0 0 104 111
GX007 0 0 50 0 0 56
GX008 0 0 0 2 23 30
GX009 0 0 483 0 0 507
GX010 0 67 0 0 0 137"
df <- read.table(text=zz,header=T)
结构:
ID ST A B C D End
GX001 0 0 438 0 0 520
GX002 0 182 0 0 198 331
GX003 0 0 0 92 118 118
GX004 0 0 0 0 0 218
GX005 0 24 145 0 151 159
GX006 0 0 0 0 104 111
GX007 0 0 50 0 0 56
GX008 0 0 0 2 23 30
GX009 0 0 483 0 0 507
GX010 0 67 0 0 0 137
我想计算每个阶段观察 的时间。
例如:经过50个单位时间之后,GX007
从0 ST
转到B
阶段。经过56个单位时间之后,GX007
从B
转到End
。因此,GX007
在ST
中花费了50个单位的时间,在B
中花费了6个单位的时间。
输出:
ID ST A B C D End
GX001 438 0 82 0 0 0
GX002 182 16 0 0 133 0
GX003 92 0 0 26 0 0
GX004 218 0 0 0 0 0
GX005 24 121 6 0 8 0
GX006 104 0 0 0 7 0
GX007 50 0 6 0 0 0
GX008 2 0 0 21 7 0
GX009 483 0 24 0 0 0
GX010 67 70 0 0 0 0
注意:每次观察都从 ST 开始,到 End 结束。许多观察结果都跳过了阶段。
答案 0 :(得分:1)
这是执行此操作的自定义功能。我假设您的所有条目都大于或等于0 ......
data.frame(df[1],
t(apply(df[-1], 1, function(r) {
if (any(r > 0)) r[c(1, which(r>0))] <- c(r[r>0][1], diff(r[r>0]), 0)
r
}))
)
# ID ST A B C D End
#1 GX001 438 0 82 0 0 0
#2 GX002 182 16 0 0 133 0
#3 GX003 92 0 0 26 0 0
#4 GX004 218 0 0 0 0 0
#5 GX005 24 121 6 0 8 0
#6 GX006 104 0 0 0 7 0
#7 GX007 50 0 6 0 0 0
#8 GX008 2 0 0 21 7 0
#9 GX009 483 0 24 0 0 0
#10 GX010 67 70 0 0 0 0