提问人:Joe King 提问时间:7/23/2012 最后编辑:HenrikJoe King 更新时间:7/28/2022 访问量:291168
根据向量中的值从数据框中选择行
Select rows from a data frame based on values in a vector
问:
我有类似的数据:
dt <- structure(list(fct = structure(c(1L, 2L, 3L, 4L, 3L, 4L, 1L, 2L, 3L, 1L, 2L, 3L, 2L, 3L, 4L), .Label = c("a", "b", "c", "d"), class = "factor"), X = c(2L, 4L, 3L, 2L, 5L, 4L, 7L, 2L, 9L, 1L, 4L, 2L, 5L, 4L, 2L)), .Names = c("fct", "X"), class = "data.frame", row.names = c(NA, -15L))
我想根据变量中的值从此数据框中选择行。例如,如果我想选择包含“a”或“c”的行,我可以这样做:fct
dt[dt$fct == 'a' | dt$fct == 'c', ]
这产生
1 a 2
3 c 3
5 c 5
7 a 7
9 c 9
10 a 1
12 c 2
14 c 4
不出所料。但是我的实际数据更复杂,我实际上想根据向量中的值选择行,例如
vc <- c('a', 'c')
所以我试过了
dt[dt$fct == vc, ]
但这当然行不通。我知道我可以编写一些东西来遍历向量并提取所需的行并将它们附加到新的数据帧中,但我希望有一种更优雅的方法。
那么,如何根据向量的内容过滤/子集数据呢?vc
答:
172赞
johannes
7/23/2012
#1
看一看。?"%in%"
dt[dt$fct %in% vc,]
fct X
1 a 2
3 c 3
5 c 5
7 a 7
9 c 9
10 a 1
12 c 2
14 c 4
您也可以使用:?is.element
dt[is.element(dt$fct, vc),]
评论
0赞
SophiaL
3/17/2022
is.element
是最直观易懂的。
38赞
Andrew Haynes
1/29/2017
#2
与上述类似,使用从:filter
dplyr
filter(df, fct %in% vc)
17赞
Jaap
3/30/2017
#3
另一种选择是使用键控:data.table
library(data.table)
setDT(dt, key = 'fct')[J(vc)] # or: setDT(dt, key = 'fct')[.(vc)]
其结果是:
fct X
1: a 2
2: a 7
3: a 1
4: c 3
5: c 5
6: c 9
7: c 2
8: c 4
其作用:
setDT(dt, key = 'fct')
将 转换为 A(这是 的增强形式),并将列设置为键。data.frame
data.table
data.frame
fct
- 接下来,您可以用 .
vc
[J(vc)]
注意:当键是因子/字符变量时,您也可以使用,但当是数值向量时,这将不起作用。When 是数值向量且未包装在 或 中,将用作 rowindex。setDT(dt, key = 'fct')[vc]
vc
vc
J()
.()
vc
有关键和子集概念的更详细解释,请参阅小插图键和基于快速二进制搜索的子集。
@Frank在评论中建议的替代方案:
setDT(dt)[J(vc), on=.(fct)]
当包含 中不存在的值时,需要添加:vc
dt
nomatch = 0
setDT(dt, key = 'fct')[J(vc), nomatch = 0]
艺术
setDT(dt)[J(vc), on=.(fct), nomatch = 0]
评论
0赞
Gaurav Singhal
5/10/2017
当data.table中的向量和变量是数字时,我无法让它工作。有什么想法吗?
0赞
Jaap
5/10/2017
@GauravSinghal更新了答案,则先前版本中的方法适用于字符/因子列;更新后的方法也适用于整数/数值列
0赞
user2017023
6/30/2022
@David有没有办法将其修改为仅在 ftc 不在 vc 中的位置进行选择?
2赞
David Arenburg
6/30/2022
@user2017023,是的,例如setDT(dt)[!(vc), on=.(fct)]
上一个:了解 order() 函数
下一个:为什么“[”比“子集”好?
评论
dt[dt$fct %in% vc,]
==
%in%