根据向量中的值从数据框中选择行


75

我有类似的数据:

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

我想根据fct变量中的值从此数据框中选择行。例如,如果我希望选择包含“ a”或“ c”的行,则可以这样做:

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呢?


13
尝试:dt[dt$fct %in% vc,] 基本上==是用于一项,%in%并且用于向量比较。
泰勒·林克

Answers:


133

看一看?"%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),]


11

另一种选择是使用密钥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')将列设置为键将转换data.framedata.table(是的增强形式data.framefct
  • 接下来,您可以使用来设置vc向量的子集[J(vc)]

注意:当键是一个因子/字符变量时,您也可以使用,setDT(dt, key = 'fct')[vc]但是当vc它是数字矢量时将不起作用。whenvc是一个数字向量,并且不包装在J()或中.()vc将作为rowindex。

关于和子集的概念的更详细说明,可以在插图小插图“基于键和快速二进制搜索的子集”中找到

@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]

当data.table中的向量和变量为数字时,我无法使其正常工作。有任何想法吗?
加拉夫·辛哈尔

@GauravSinghal更新了答案,以前版本中的方法适用于字符/因子列;更新的方法也适用于整数/数值列
Jaap,2017年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.