2014-01-29 54 views
3

从表中其他行,我想创建一个表出来另一个表(data.table)的具有基于条件的其他行。可以说在下表中,我想创建一个额外的行,如果length(indicator)>2。结果应该是下表。如何创建data.table与基于状态

源表看起来是这样的:

 
    id indicator 
1 123 abc 
2 456 NA 
3 456 NA 
4 456 NA 
5 123 abcd 
6 789 abc 
dt1 <- data.table(id=c(123, 456, 456, 456, 123, 789), indicator = c("abc", NA, NA, NA, "abcd", "abc")) 

结果表应该是这样的:

 
    id indicator 
1 123 abc 
2 123 abc2 
3 456 NA 
4 456 NA 
5 456 NA 
6 123 abcd 
7 123 abcd2 
8 789 abc 
9 789 abc2 
dt2 <- data.table(id=c(123,123, 456, 456, 456, 123,123,789, 789), indicator = c("abc", "abc2", NA, NA, NA, "abcd", "abcd2", "abc", "abc2")) 

回答

3

编辑:清洁版本礼貌阿伦(注意有一个key参数添加到data.table创建中):

dt1 <- data.table(
    id=c(123, 456, 456, 456, 123, 789), 
    indicator = c("abc", NA, NA, NA, "abcd", "abc"), 
    key=c("id", "indicator") 
)      
dt1[, 
    list(indicator= 
    if(nchar(indicator) > 2) 
     paste0(indicator, c("", 2:(max(2, .N)))) 
    else 
     rep(indicator, .N) 
    ), 
    by=list(indicator, id) 
][, -1, with=F] 
#  id indicator 
# 1: 123  abc 
# 2: 123  abc2 
# 3: 123  abcd 
# 4: 123  abcd2 
# 5: 456  NA 
# 6: 456  NA 
# 7: 456  NA 
# 8: 789  abc 
# 9: 789  abc2      

旧版本

有可能是一个更优雅的方式,但是这将做到这一点。基本上,你可以将不符合条件的行与那些通过附加数字修饰符(或第一个“”修饰符)修改的行绑定。请注意,如果您有非唯一的ID /指标,这只会增加一个数字调节剂(即123-ABC,123-ABC,结束了123-ABC,123-ABC2,123-ABC3)。

dt1 <- data.table(id=c(123, 456, 456, 456, 123, 789), indicator = c("abc", NA, NA, NA, "abcd", "abc"))      
rbind(
    dt1[nchar(indicator) <= 2 | is.na(indicator)], 
    dt1[ 
    nchar(indicator) > 2, 
    list(indicator=paste0(indicator, c("", 2:(max(2, .N))))), 
    by=list(indicator, id) 
    ][, -1, with=F] 
)[order(id, indicator)] 
#  id indicator 
# 1: 123  abc 
# 2: 123  abc2 
# 3: 123  abcd 
# 4: 123  abcd2 
# 5: 456  NA 
# 6: 456  NA 
# 7: 456  NA 
# 8: 789  abc 
# 9: 789  abc2      
+1

@Arun,谢谢你的提示。在这种情况下不会想到'j = if/else'。爱学习新东西。 – BrodieG

+0

我的荣幸。你做得很好! – Arun

+0

工程太棒了!谢谢 – Miriam