【发布时间】:2018-06-01 18:12:56
【问题描述】:
我正在尝试使用match() 函数从data.table DT1 动态选择列,同时应用过滤器并将其与另一个data.table DT2 的列匹配。它不起作用,大概是因为当从 data.table 中动态选择列时,输出又是 data.table 而不是向量。
一个例子:
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和table强制转换为普通类型(R的排序中的两种类型中的后者,逻辑
【问题讨论】:
-
您可以尝试使用
[[进行子集化,即match(DT1[col2 == "Europe"][[columnName]], DT2[, col3]) -
@docendodiscimus,谢谢。
标签: r data.table