Правильный синтаксис для фильтрации или выбора строк во фрейме данных с помощью функции - PullRequest
3 голосов
/ 25 марта 2019

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

Я пытался использовать subset и filter и select (включая starts_with из dplyr), но я не могу найти правильный синтаксис для достижения того, что мне нужно.Все примеры, которые я нашел, демонстрируют фильтрацию по значению, например x > 1 или подобному, а не через функцию.Мне удалось только создать ошеломляющее множество различных сообщений об ошибках.

ссылки: https://www.rdocumentation.org/packages/dplyr/versions/0.7.8/topics/select https://www.rdocumentation.org/packages/dplyr/versions/0.7.8/topics/filter_all https://www.rdocumentation.org/packages/tidyselect/versions/0.1.1/topics/select_helpers https://www.rdocumentation.org/packages/base/versions/3.5.1/topics/startsWith ФильтрСтроки data.frame по логическому условию

library(tidyverse)
a <- c("A1435","A6732","A8841","B7623","B7714","B3154")
b <- c("place 1", "place 2", "place 3", "place 4", "place 5", "place 6")
test_frame <- data.frame(a,b)

Вот некоторые из вещей, которые я пробовал:

subset <- subset(test_frame, subset = startsWith(test_frame$a, "A"))
## Error in startsWith(test_frame$a, "A") : non-character object(s)
subset <- subset(test_frame, subset = startsWith(test_frame[,1], "A") == 1)
## Error in startsWith(test_frame[, 1], "A") : non-character object(s)
subset <- test_frame %>% dplyr::select(test_frame, starts_with("A", ignore.case = TRUE, vars = a))
## Error: `test_frame` must evaluate to column positions or names, not a list
subset <- dplyr::select(test_frame, starts_with("A", ignore.case = TRUE, vars = a))
## Error in inds_combine(.vars, ind_list) : Position must be between 0 and n
subset <- test_frame %>% dplyr::filter_if(test_frame$a, ~ starts_with("A"))
## Error: Can't convert a `factor` object to function
subset <- vars_select(test_frame, starts_with("A"))
## Error: `vars` must be a character vector
subset <- dplyr::filter(test_frame, dplyr::starts_with("A"), all_vars(. == a))
## Error: No tidyselect variables were registered
subset <- test_frame$a %>% grep("^A", .)
## [1] 1 2 3

Эта последняя попытка, по крайней мере, не дает мне ошибки - но и не помогает мне сделать подмножество фрейма данных.Можно ли объединить этот grep с одной из вышеперечисленных функций, чтобы получить мой результат?

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

* РЕДАКТИРОВАТЬ: Удивительно - несколько действительно полезных отзывов в течение нескольких минут после публикации.Спасибо всем, спасибо Stack Overflow!*

Ответы [ 3 ]

3 голосов
/ 25 марта 2019

Вы можете использовать grepl

 test_frame[grepl("^A", test_frame$a), ]
      a       b
1 A1435 place 1
2 A6732 place 2
3 A8841 place 3
3 голосов
/ 25 марта 2019

Мы можем использовать select_if для выбора столбцов на основе условия

test_frame %>% 
    select_if( ~ any(str_detect(.x, "A")))

Или для filter ввода строк

test_frame %>% 
     filter_all(any_vars(str_detect(., "A")))
#      a       b
#1 A1435 place 1
#2 A6732 place 2
#3 A8841 place 3

Или с использованием подмножествастолбцов

test_frame %>%
     filter_at(vars(starts_with("a")), any_vars(str_detect(., "A")))

Или используя base R

i1 <- Reduce(`|`, lapply(test_frame[startsWith(names(test_frame), "a")],
            grepl, pattern ="^A"))
test_frame[i1,]
2 голосов
/ 25 марта 2019

Для сорта добавлено менее эффективное решение:

 test_frame[startsWith(as.character(test_frame$a),"A"),]


   #    a       b
   # 1 A1435 place 1
   # 2 A6732 place 2
   # 3 A8841 place 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...