Фильтр Dplyr с использованием динамического имени столбца и динамического значения - PullRequest
0 голосов
/ 28 февраля 2019

Этот же вопрос был задан здесь и помечен как дубликат.Тем не менее, он не является дубликатом и не получил никаких ответов.Я спрашиваю снова.

У меня есть

df = data.frame(A=1:10, B=sample(c('TT', 'TG', 'GG'), 10, replace=T))
# df
#    A  B
#1   1 TG
#2   2 TG
#3   3 GG
#4   4 TT
#5   5 TT
#6   6 TT
#7   7 GG
#8   8 TT
#9   9 TG
#10 10 TT

Если я укажу столбец, я могу использовать динамический список значений, например:

> vals=c('TT', 'GG')
> df%>% filter(B %in% !!vals)
   A  B
1  3 GG
2  4 TT
3  5 TT
4  6 TT
5  7 GG
6  8 TT
7 10 TT

Теперь я хочудобавить в col='B' сделать что-то вроде:

df%>% filter(!!col %in% !!vals)
[1] A B
<0 rows> (or 0-length row.names)

Использование

> paste(col, "==", sapply(vals, function(x){paste0("'", x, "'")}), collapse=" | ")
[1] "B == 'TT' | B == 'GG'"

Следующая чудовищность действительно работает:

> df %>% filter_(paste(col, "==", sapply(vals, function(x){paste0("'", x, "'")}), collapse=" | "))
   A  B
1  3 GG
2  4 TT
3  5 TT
4  6 TT
5  7 GG
6  8 TT
7 10 TT

Я действительно надеюсьдля этого существует простой синтаксис dplyr-eseq.

1 Ответ

0 голосов
/ 28 февраля 2019

Следуя синтаксису tidy , используйте:

df %>% filter(!!sym(col) %in% !!vals)

sym() преобразует вашу строку в символ, который dplyr знает для оценки.

Также df %>% filter(!!as.name(col) %in% !!vals) работает, как указывает @ A.Suliman.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...