Векторизованное использование функции подстроки для выбора строки в кадре данных с различной длиной - PullRequest
0 голосов
/ 08 октября 2018

В моем фрейме данных есть столбец с именем Код типа char, который выглядит как b, b1, b110-b139, b110, b1100, b1101, ... (1602 записей)

Я пытаюсь выбрать всезаписи, которые соответствуют строкам в векторе и все те, которые начинаются с той же строки.

Итак, допустим, у меня есть вектор

Selection=c("b114","d2")

, тогда я хочу все коды, такие как b114, b1140, b1141, b1142, ... а также d2, d200, d2000, d2001,d2002, d2003 и т. д. *

В принципе работает то, что мы создаем новый фрейм данных:

bTable <- TreeMapTable[substr(TreeMapTable$Code,1,4)=="b114"|substr(TreeMapTable$Code,1,2)=="d2",]

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

Я попытался сделать это так:

SelectionL=nchar(Selection) 
Beispieltable <- TreeMapTable[substr(TreeMapTable$Code,1,AuswahlL)==Auswahl1,]

, но это дает мне как-то только половинуиз необходимых записей, и я признаюсь, я действительно не знаю, что он делает.Я знаю, что мог бы использовать цикл for, но из всего, что я до сих пор читал, следует избегать циклов и решить проблему с помощью векторов.

1 Ответ

0 голосов
/ 08 октября 2018

пример данных

df <- data.frame( Code = c("b114", "b115", "b11456", "d2", "d12", "d200", "db114"),
                    stringsAsFactors = FALSE)
Selection=c("b114","d2")

ответ

library( dplyr )
#create a regex pattern to filter on
pattern <- paste0( "^", Selection, collapse = "|" )
#filter out all rows wher 'Code' dows not start with the entries from 'Selection' 
df %>% filter( grepl( pattern, Code, perl = TRUE ) )

#     Code
# 1   b114
# 2 b11456
# 3     d2
# 4   d200
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...