Фільтрування фрейму даних


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 може бути великим списком стовпців, як чи яким є рекомендований підхід для виконання цього фільтра? Дякую

Відповіді:


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 , який має довжину, таку ж, як кількість рядків у даних. Потім ми використовуємо цей вектор для вибору необхідних рядків.

Оновлення

Те саме можна досягти і з грепом:

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

в R grep з аргументами за замовчуванням повертає числа елементів у наданому векторі, які мають відповідність.


2
ще одна корисна функція any. Наприклад, якщо ви хочете перевірити, що принаймні один елемент вектора = 10ви можете написати ( any(v==10)).
nico

@nico так, але 10% у% v має 9 символів і варіант з будь-якими 10 :). Хоча для числових векторів краще використовувати рівність, оскільки R розумний, і якщо ваші дані цілі числа, змішані з реальними числами, він правильно визнає, що у вашому наборі даних є 10.
mpiktas

як щодо справи для регулярного вираження? припускаючи, що ви не хочете працювати з точною відповідністю? Чи є у них щось близьке до ~ =, як і в інших мовах? що найбільш близьке до цього виразу в R
eastafri

@Biorelated Див. grepТа agrepта пов’язана з ними документація на POSIX 1003.2 або Regex-сумісний Perl.
chl

@Biorelated, я оновив відповідь на прикладі grep.
mpiktas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.