在R中使用data.table
,我尝试连接两个列并创建一个新列,其中我具有上一步的唯一值。在下面的例子中,你可以看到代码在帧z1
上工作正常,但是在帧z2
上我得到了一个错误。但是,这两个表的创建方式相同。这两列有不同的信息,但这不应该成为相同代码在z2
上不起作用的原因。
非常感谢你的帮助,如果我不清楚,请告诉我。
最好
library(data.table)
z1 <- data.table(a = c("ARE_2014_HIES_D1_INC_GROUP", "ARE_2014_HIES_D1_INC_GROUP"),
b = c("ARE_2014_HIES_D1_INC_GROUP", "ARE_2015_HIES_D1_INC_GROUP"))
z2 <- data.table(a = c("ARG_1980_EPH_D2_INC_GROUP", "ARG_1980_EPH_D2_INC_GROUP"),
b = c("ARG_1986_EPH_D2_INC_HIST", "ARG_1986_EPH_D2_INC_HIST"))
z1[,
cache_id := as.list(apply(.SD, 1, unique)),
.SDcols = c("a", "b")
]
z1[]
#> a b
#> 1: ARE_2014_HIES_D1_INC_GROUP ARE_2014_HIES_D1_INC_GROUP
#> 2: ARE_2014_HIES_D1_INC_GROUP ARE_2015_HIES_D1_INC_GROUP
#> cache_id
#> 1: ARE_2014_HIES_D1_INC_GROUP
#> 2: ARE_2014_HIES_D1_INC_GROUP,ARE_2015_HIES_D1_INC_GROUP
z2[,
cache_id := as.list(apply(.SD, 1, unique)),
.SDcols = c("a", "b")
]
#> Error in `[.data.table`(z2, , `:=`(cache_id, as.list(apply(.SD, 1, unique))), : Supplied 4 items to be assigned to 2 items of column 'cache_id'. If you wish to 'recycle' the RHS please use rep() to make this intent clear to readers of your code.
z2[]
#> a b
#> 1: ARG_1980_EPH_D2_INC_GROUP ARG_1986_EPH_D2_INC_HIST
#> 2: ARG_1980_EPH_D2_INC_GROUP ARG_1986_EPH_D2_INC_HIST
创建于2023-06-12带有reprex v2.0.2
5条答案
按热度按时间nnsrf1az1#
目前还不清楚你为什么要这样做,我怀疑我们正在处理一个xy problem在这里。无论如何,您应该几乎永远不需要迭代data.table的行。这通常是一个设计问题。如果你真的需要这样做,那么如果它不是一次性的,或者你的data.table实际上很大,那么就转向Rcpp。
无论如何,在特定的示例中,您可以使用
data.table::unique
:如果必须这样做,可以将
value
列拆分为rn
列,并将其添加到data.table中。但是,你为什么需要这个?quhf5bfb2#
apply
如果每个结果的长度相同则返回矩阵,否则列出:此外,矩阵上的
as.list
不会给予你列列表,但你会得到每个元素作为列表的元素:因此,警告的长度。
我不太清楚你的最终结果应该是什么,所以我不能提供明确的答案。
vsikbqxv3#
您可以尝试以下方法:
对于
z2
也是如此输出:
zsbz8rwp4#
另一种方法不需要像@langtang的回答那样遍历行:
yeotifhr5#
谢谢大家的回答。他们真的帮助了我,我学到了更多关于apply和data.table的知识。我选择@Langtang回答,因为它是最快的。然而,Thak you so much@hieu-nguyen for both solutions.我认为
simply = FALSE
是问题的关键,但你在评论中提出了这一点,我不能选择作为答案。请在基准以下查找创建于2023 - 06 - 13带有reprex v2.0.2