gpt4 book ai didi

r - 为什么不能使用列名向量来过滤 data.table 中的行?

转载 作者:行者123 更新时间:2023-12-05 08:29:43 24 4
gpt4 key购买 nike

假设我有以下数据 dt 和一个列名向量 cols

dt <- data.table(id = letters[1:10], amount = 1:10, id2 = c(rep('a',5),rep('b',5)))
cols <- 'id'

谁能帮我理解为什么这种方法行不通

dt[cols=='a']

但是这个有用吗?

dt[get(cols)=='a']

这两种方法不应该在 vec 中返回相同的东西吗?

最佳答案

Akrun已经提供了一个有用的solution针对您的问题,所以我会提供诊断

过滤data.table

要按照您的意愿过滤 dtdata.table 需要 entire vector 10 逻辑 值,对应于 dt 中的十行,指示保留哪些行 (TRUE) 和丢弃哪些行 (FALSE)。因此,当您过滤 dt 时,您必须在 [ 括号内包含这样一个逻辑向量(或对其求值的东西)。这是一个人工示例:

dt[c(TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE)]

这将为我们提供以下 data.table 中的过滤结果:

   id amount id2
1: a 1 a
2: d 4 a
3: e 5 a
4: g 7 b

为什么 cols 失败

因为 colscharacter 值为 'id'

cols <- 'id'

然后比较cols == 'a'和比较'id' == 'a'是一样的,显然是FALSE :

dt[cols == 'a']
# ...is the same as...
dt['id' == 'a']
# ...is the same as...
dt[FALSE]

这仅提供单个 逻辑 值 (FALSE),而不是 向量 data.table 过滤真正需要的十个 逻辑 值。

结果是一个 data.table 省略了一切

Empty data.table (0 rows and 3 cols): id,amount,id2

dt[TRUE] 相比,后者包括一切:

    id amount id2
1: a 1 a
2: b 2 a
3: c 3 a
4: d 4 a
5: e 5 a
6: f 6 b
7: g 7 b
8: h 8 b
9: i 9 b
10: j 10 b

为什么 get(cols) 有效

当您使用 get('my_variable') 时,您是在告诉 R 从周围环境中“获取”my_variable 的值。如果您在 [dt

的操作中运行 get()
dt[get(# ...
]

R 将在 dt 中搜索给定名称的列,并将该列(向量)作为 get() 的值返回。因此,在此上下文中使用 get('id') 将为您提供 dt 中的列 id,这是向量

c('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j')
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"

现在我们把它们放在一起:

dt[get(cols) == 'a')
# ...is the same as...
dt[get('id') == 'a')
# ...is the same as...
dt[c('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j') == 'a']
# ...is the same as...
dt[c(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE)]

这为我们提供了以下 data.table 中的过滤结果:

   id amount id2
1: a 1 a

关于r - 为什么不能使用列名向量来过滤 data.table 中的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68642274/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com