Фильтрация данных

12

Все еще изучая основные функции в R, Кажется, что функция подмножества фильтрует только условие на основе одного столбца с несколькими условиями или без них?

Как я могу легко отфильтровать данные из кадра данных?

  1. когда вам предоставляются несколько условий

  2. Когда условие должно быть применено ко всем доступным столбцам.

Пример: дан кадр данных, содержащий

name    D1      D2     D3      D4
julius  "A"     "A"    "B"     "B"
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

скажем, я хочу отфильтровать этот фрейм данных так, чтобы у меня были только те имена, у которых от D1 до D4 - «E»,

name    D1      D2     D3      D4
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

Скажите, что D1 может быть большим списком столбцов, как или каков рекомендуемый подход для выполнения этого фильтра? Спасибо

eastafri
источник

Ответы:

26

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

 subset(data, D1 == "E" | D2 == "E")

выберет те строки, для которых столбец D1 или столбец D2 имеет значение «E». Посмотрите на страницы справки для доступных логических операторов:

 > ?"|"

Для вашего второго вопроса вам нужно отфильтровать строки. Это может быть достигнуто следующим образом

 collist <- c("D1","D2","D3","D4")
 sel <- apply(data[,collist],1,function(row) "E" %in% row)
 data[sel,]

Первый применяемый аргумент включает столбцы, по которым мы должны фильтровать. Второй аргумент - 1, что означает, что мы перебираем строки данных. Третий аргумент - безымянная однострочная функция, которая возвращает TRUE, если в строке присутствует «E», и FALSE, если «E» отсутствует.

Результатом применения функции будет логический вектор sel , длина которого равна числу строк в данных. Затем мы используем этот вектор, чтобы выбрать необходимые строки.

Обновить

То же самое можно сделать с помощью grep:

sel <- apply(data[,collist],1,function(row) length(grep("E",row))>0)

в R grep с аргументами по умолчанию возвращает количество элементов в предоставленном векторе, которые имеют соответствующий шаблон.

mpiktas
источник
2
Еще одна полезная функция any. Например, если вы хотите проверить, что хотя бы один элемент вектора есть, = 10вы можете написать ( any(v==10)).
Нико
@nico да, но 10% в% v имеет 9 символов и вариант с любым 10 :). Хотя для числовых векторов лучше использовать равенство, так как R умный и если ваши данные являются целыми числами, смешанными с действительными числами, он будет правильно распознавать, что у вас есть 10 в вашем наборе данных.
mpiktas
как обстоят дела с регулярным выражением? Предполагая, что вы не хотите работать с точным соответствием? Есть ли у них что-то близкое к ~ =, как на других языках? что наиболее близко к этому выражению в R
eastafri
@Biorelated Смотрите grepи agrepи соответствующую документацию по POSIX 1003.2 или Perl-совместимому регулярному выражению.
хл
@Biorelated, я обновил ответ на примере grep.
mpiktas