我想创建一个列来标识另一列中的所有行,这些行在值之后没有任何后续值,例如。
我的数据如下:
ID co choc
1 . 2
1 . 2
1 . 2
1 5 0
1 . 2
1 . 2
2 . 2
2 . 2
2 13 0
2 . 2
2 . 2
2 17 2
2 . 2
2 . 2
我希望它看起来像:
D ID co choc
1 . 2
1 . 2
1 . 2
1 5 0
D 1 . 2
D 1 . 2
2 . 2
2 . 2
2 13 0
2 . 2
2 . 2
2 17 2
D 2 . 2
D 2 . 2
答案 0 :(得分:0)
library(data.table)
dt = data.table(ID = c(1,1,1,1,1,1,2,2,2,2),
val = c(NA,NA,1,NA,2,NA,NA,1,NA,NA),
somecol = c(1:10))
# ID val somecol
# 1: 1 NA 1
# 2: 1 NA 2
# 3: 1 1 3
# 4: 1 NA 4
# 5: 1 2 5
# 6: 1 NA 6
# 7: 2 NA 7
# 8: 2 1 8
# 9: 2 NA 9
#10: 2 NA 10
dt[, .SD[seq_len(tail(which(!is.na(val)), 1))], by = ID]
# ID val somecol
#1: 1 NA 1
#2: 1 NA 2
#3: 1 1 3
#4: 1 NA 4
#5: 1 2 5
#6: 2 NA 7
#7: 2 1 8
要理解内在表达,可以在val = dt[ID == 1, val]
上试一试。
答案 1 :(得分:0)
我解决这个问题的想法是从每个组的最后一行开始,基本上分配一个值“D”,直到第一个非零value
被击中。我使用了cumsum
,它与NA
的效果不佳。在这种情况下,value
似乎被识别为大于0的内容,因此我将NA
更改为0
。在制作新专栏D
之后,我再次将其拒之门外。
require(plyr)
dat1 = data.frame(ID = c(rep(1, 6), rep(2, 8)),
val = c(NA,NA,NA,5,NA,NA,NA,NA,13,NA,NA,17,NA,NA),
choc = sample(c(0,2), 14, replace = TRUE))
dat1$val[is.na(dat1$val)] = 0
dat1 = ddply(dat1, .(ID), transform, D = rev(ifelse(cumsum(rev(val)) == 0, "D", "")))
dat1$val[dat1$val == 0] = NA
ID val choc D
1 1 NA 0
2 1 NA 2
3 1 NA 2
4 1 5 2
5 1 NA 2 D
6 1 NA 0 D
7 2 NA 0
8 2 NA 0
9 2 13 2
10 2 NA 0
11 2 NA 2
12 2 17 0
13 2 NA 0 D
14 2 NA 2 D