2017-01-31 20 views
0

Я изучаю R и экспериментирую с подмножеством() и grepl() с Regex для фильтрации кадра данных. Я создал очень маленькую dataframe, чтобы играть с:subset() с grepl() с использованием REGEX для фильтрации данных в R

x y z w 
1 10 a k 
2 12 b l 
3 14 c m 
4 16 d n 
5 18 e o 

Мой код заключается в следующем:

subset(df14, grepl('^c | [l - n]', c(df14$z , df14$w)), grepl('[yz]', colnames(df14))) 

На мой взгляд, второй аргумент должен возвращать индексы строк найденных grepl() для соответствия шаблону в столбцах с именами: 'z' или 'w'. Однако это не то, что происходит (возвращает пустой фреймворк с столбцами y и z).

Я ожидал бы вернуть строки 2,3,4, поскольку столбец «w» содержит буквы l, m, n, указанные в шаблоне регулярного выражения [ln], и столбцы z и w, так как эти имена соответствуют регулярному выражению [ yz] в третьем аргументе подмножества().

(я подозреваю, что он ищет совпадения в названиях столбцов, а содержание столбцов, что меня интересует.)

Очевидно, что я не заинтересован в результате таковой. Это эксперимент, чтобы понять, как работают функции. Итак, я ищу объяснение и способ исправить конкретный код - не альтернативное решение.

Ваш совет будет оценен по достоинству.

+1

Что такое нужная outpu хотя? Кроме того, если ваши столбцы содержат одиночные буквы, нет необходимости в регулярном выражении, а '=='/'% in%' или 'match' должно быть более эффективным. –

ответ

1

Существует множество проблем.

Одна из проблем - дополнительные пробелы в ваших шаблонах. Бросьте их или используйте модификатор free-spacing (?x) с perl = TRUE. В любом случае вам нужно избавиться от пробелов в классе символов. [l-n] соответствует «м» и [l - n] не делает, даже с (?x). Вы можете больше узнать о модификаторе свободного интервала и его влиянии внутри и снаружи классов символов here.

Другие проблемы в том, что в вашем первом grepl вы ищете в векторе (вектор символов, который мы не можем сказать из примера) длины 10. Что бы ИСТИНА в 6-й позиции означало для 5-й строки data.frame? Не имеет смысла возвращать 6-ю строку кадра данных из 5 строк. Вместо этого вы можете увидеть, найден ли ваш шаблон для столбца «w» или (|) столбец «z». Посмотрите на каждый столбец, а не на конкатенацию столбцов.

Другая проблема во втором grepl, "w" не подходит для [yz].Если вы хотите, чтобы выбрать столбцы с именем, содержащим «ш» или «г», один из способов будет с [wz]:

Там нет необходимости для ^ якоря, поскольку все ваши строки содержат один символ, но Я оставлю это в любом случае:

subset(df14, 
     subset = grepl('^c|[l-n]', df14$z) | 
      grepl('^c|[l-n]', df14$w), 
     select = grepl('[wz]', colnames(df14))) 
# z w 
#2 b l 
#3 c m 
#4 d n 

Или с модификатором свободного расстояния режим и другой шаблон ([wz] против w|z) для второго grepl:

subset(df14, 
     subset = grepl('(?x)^c | [l-n]', df14$z, perl = TRUE) | 
      grepl('(?x)^c | [l-n]', df14$w, perl = TRUE), 
     select = grepl('w|z', colnames(df14))) 
# z w 
#2 b l 
#3 c m 
#4 d n 
0

Выражение поиска '^c | [l - n]' не может найти что-либо в этих столбцах. Кроме того, более интуитивный подход заключается в использовании [ , ] для этого типа подмножества. См. http://adv-r.had.co.nz/Subsetting.html.

+0

Но не содержит ли буквы l, m, n? – im7

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

  • Нет связанных вопросов^_^