2016-06-01 2 views
1

У меня есть список переменных в последовательности, и мне было интересно, был ли простой способ подмножества в dplyr с одинаковыми условиями среди последовательности переменных.Как подмножество в 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') 

Спасибо

ответ

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] ] 
+0

Большое вам спасибо за все варианты! –

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") 
1
select(data, DX1:DX25) %>% apply(., 1, function(x) any(x == '7586')) %>% data[. , ] 
+1

Спасибо! Это сделал трюк! –

Смежные вопросы