gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:00:58 25 4
gpt4 key购买 nike

我想从另一个表 (data.table) 中创建一个表,该表具有基于条件的附加行。假设在下表中,如果 length(indicator)>2,我想创建一个额外的行。结果应该是下表。

源表如下所示:

    id  indicator1   123 abc2   456 NA3   456 NA4   456 NA5   123 abcd6   789 abc
dt1 <- data.table(id=c(123, 456, 456, 456, 123, 789), indicator = c("abc", NA, NA, NA, "abcd", "abc"))

结果表应该是这样的:

    id  indicator1   123 abc2   123 abc23   456 NA4   456 NA5   456 NA6   123 abcd7   123 abcd28   789 abc9   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"))

最佳答案

编辑:由 Arun 提供的更清晰的版本(注意 data.table 创建中添加了一个 key 参数):

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

旧版本

可能有一种更优雅的方法,但这可以做到。基本上,您将不符合条件的行与符合条件的行绑定(bind),通过附加数字修饰符(或第一个修饰符为“”)进行修改。请注意,如果您有非唯一 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

关于r - 如何根据条件从表中创建带有附加行的 data.table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21431765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com