2014-01-29 70 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