我想根据另一个表(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"))
编辑:清洁器版本由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