如何在dplyr中使用相同条件在多个变量中进行子集化

时间:2016-06-01 01:37:43

标签: r filter dplyr subset

我有一个序列变量列表,我想知道在变量序列中是否有一个简单的dplyr子集化方法。

例如,我有以下变量:

DX1 DX2 DX3 DX4 DX5

如果这些变量中的任何一个包含以下字符串' 7586'我想要我的数据子集。

从单个变量中进行子集我将执行以下操作:

filter(df, DX1 == '7586')

我能想到的唯一方法是:

filter(df, DX1 == '7586' | DX2 == '7586' | DX3 == '7586' | DX4 == '7586' | DX5 == '7586')

我的实际数据集包含DX1-DX25,编写起来非常繁琐。

有没有简化上述方法的方法?

的内容
filter(df, DX1-25 == '7586')

谢谢

3 个答案:

答案 0 :(得分:5)

两个选项,一个在基础R中,一个在dplyr中,应该产生相同的结果:

df[rowSums(df == 7586) > 0,]

library(dplyr)
df %>% 
   filter(rowSums(. == 7586) > 0)

data.table版本的乐趣,如果有必要,它应该更快一点:

library(data.table)
setDT(df)[, .SD[Reduce(`+`, lapply(.SD, `==`, 7586) ) > 0] ]

答案 1 :(得分:1)

如果DX1~DX25是data.frame的全部或大部分列,可能就像这样?

df[apply(df, 1, function(row) any(row == '7586')), ]

     x    y
1 7586  322
2 3322 7586

数据

structure(list(x = structure(c(2L, 1L), .Label = c("3322", "7586"
), class = "factor"), y = structure(1:2, .Label = c("322", "7586"
), class = "factor")), .Names = c("x", "y"), row.names = c(NA, 
-2L), class = "data.frame")

答案 2 :(得分:1)

select(data, DX1:DX25) %>% apply(., 1, function(x) any(x == '7586')) %>% data[. , ]