【问题标题】:Match() and the dynamic selection of columns of a data.tableMatch() 和 data.table 列的动态选择
【发布时间】: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


【解决方案1】:

在不使用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"])

【讨论】:

  • 使用数据框确实有效。我实际上是在尝试转换我的工作数据框代码:) 我不想再使用数据框了,因为我发现数据表更快并且代码更易于阅读。
【解决方案2】:

@docendodiscimus 提供了数据表的解决方案:答案你可以尝试用 [[ 进行子集化,即 match(DT1[col2 == "Europe"][[columnName]], DT2[, col3]) em>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2023-03-12
    • 2012-08-10
    • 1970-01-01
    相关资源
    最近更新 更多