如何根据条件从表中创建带有附加行的data.table

问题描述 投票:3回答:1

我想根据另一个表(data.table)创建一个表,该表具有基于条件的其他行。可以说,在下表中,如果要length(indicator)>2,我想创建一个附加行。结果应为下表。

源表看起来像这样:

ID指示1123 abc2456不适用3456不适用4456不适用5123 abcd6789 abc
dt1 <- data.table(id=c(123, 456, 456, 456, 123, 789), indicator = c("abc", NA, NA, NA, "abcd", "abc"))

结果表应如下所示:

ID指示1123 abc2123 abc23456不适用4456不适用5456不适用6123 abcd7123 abcd28789 abc9789 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"))
r conditional data.table
1个回答
3
投票

编辑:清洁器版本由Arun提供(请注意,在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]
#     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]
)[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                    
© www.soinside.com 2019 - 2024. All rights reserved.