标识没有任何后续值的行

时间:2013-10-10 18:33:51

标签: r

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

我的数据如下:

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

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