Match()和data.table的列的动态选择
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Match()和data.table的列的动态选择相关的知识,希望对你有一定的参考价值。
我正在尝试使用match()
函数从data.table DT1
动态选择列时应用过滤器并将其匹配到另一个data.table DT2
的列。它不起作用,大概是因为当从data.table动态选择列时,输出又是data.table而不是vector。
一个例子:
col1 = c(1, 3, 1, 3, 2, 2)
col2 = c("Europe", "Europe", "Europe", "Europe", "Asia", "Asia")
DT1 = data.table(col1, col2)
col3 = 1:3
col4 = c( "carrot", "apple", "tomato")
DT2 = data.table(col3, col4)
这有效:
> match(DT1[col2 == "Europe", col1], DT2[, col3])
[1] 1 3 1 3
这(我需要的)不起作用:
> columnName = "col1"
> match(DT1[col2 == "Europe", columnName, with = FALSE], DT2[, col3])
[1] NA
只有当col1作为data.table的j
中的变量输入时,结果才是向量。这可能是原因吗?说明我的意思:
> DT1[, col1]
[1] 1 3 1 3 2 2
> DT1[, "col1"]
col1
1: 1
2: 3
3: 1
4: 3
5: 2
6: 2
我认为match()
会自动处理这个因为它的帮助文件说明:
“因子,原始向量和列表被转换为字符向量,然后在匹配之前将x和表强制转换为公共类型(R的排序中的两种类型中的较晚者,逻辑<整数<numeric <complex <字符)。如果不兼容它具有正长度,它被强制为普通类型。“
答案
它似乎在不使用data.table时有效,我认为在使用col1
时应该小心,因为矢量col1
与data.frame或data.table的列之间存在混淆。
DT1 = data.frame(col1=c(1, 3, 1, 3, 2, 2), col2=c("Europe", "Europe", "Europe", "Europe", "Asia", "Asia"))
DT2 = data.frame(col3 = 1:3, col4 = c( "carrot", "apple", "tomato"))
match(DT1[DT1$col2 == "Europe", "col1"], DT2[, "col3"])
columnName = "col1"
match(DT1[DT1$col2 == "Europe", columnName], DT2[, "col3"])
另一答案
@docendodiscimus为数据表提供了一个解决方案:答案您可以尝试使用[[,即匹配(DT1 [col2 ==“Europe”] [[columnName]],DT2 [,col3])进行子集化
以上是关于Match()和data.table的列的动态选择的主要内容,如果未能解决你的问题,请参考以下文章
在 R 中,自定义由 dcast.data.table 创建的列的名称