0

我想创建一个列来标识另一列中的所有行,该列在值之后没有任何后续值,例如。

我的数据看起来像:

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
4

2 回答 2

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]

于 2013-10-10T19:01:37.653 回答
0

我解决这个问题的想法是从每组的最后一行开始,基本上分配一个“D”值,直到第一个非零value被击中。我用过cumsum,和 . 搭配不太好NA。在这种情况下, avalue似乎被识别为大于 0 的东西,所以我将其更改NA0. 制作完新专栏后,我又把它们转回去了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
于 2013-10-10T22:35:36.210 回答