R 基于向量中的值从数据帧中选择行

R 基于向量中的值从数据帧中选择行,r,subset,r-faq,R,Subset,R Faq,我有类似的数据: 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", "

我有类似的数据:

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))
产生

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')
但这当然行不通。我知道我可以编写一些代码来循环遍历向量,提取所需的行并将它们附加到新的数据帧中,但我希望有一种更优雅的方法

那么,我如何根据向量的内容过滤/子集我的数据呢

您还可以使用
?is.element

dt[is.element(dt$fct, vc),]

与上述类似,使用
dplyr
中的
filter

filter(df, fct %in% vc)

另一种选择是使用键控的
数据。表

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')
    data.frame
    转换为
    data.table
    (这是
    data.frame
    的增强形式),并将
    fct
    列设置为键
  • 接下来,您可以使用
    vc
    向量对
    [J(vc)]
    进行子集
注意:当键是一个因子/字符变量时,也可以使用
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]
或:


试试看:
dt[dt$fct%in%vc,]
基本上
=
用于一个项目,
%in%
用于向量比较。当data.table中的向量和变量是数字时,我无法使它工作。有什么想法吗?@GauravSinghal更新了答案,之前版本中的方法适用于角色/因子列;更新后的方法也适用于整数/数字列
   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)[J(vc), on=.(fct)]
setDT(dt, key = 'fct')[J(vc), nomatch = 0]
setDT(dt)[J(vc), on=.(fct), nomatch = 0]