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 创建的列的名称

通过R中的列的cumsum拆分data.table

R之data.table 介绍

如何在data.table中使用某些列名的字符向量选择列?[重复]

将 data.table 列快速连接成一个字符串列

匹配一个变量后,仅将一个变量从一个 R data.table 复制到另一个