Почему функции stringr и purrr работают только вместе, когда я создаю функцию? - PullRequest
0 голосов
/ 26 июня 2018

Работая над текстовым фреймом данных, я заметил, что функции str_remove_all и modify работают вместе только тогда, когда я создаю функцию, использующую str_remove_all, и мне интересно, сможет ли кто-нибудь объяснить, почему это так. Например:

favoriteFruit <- c("apple", "banana", "favorite is banana", "strawberry", "favorite is apple")
favoriteVeg <- c("carrot", "carrot", "celery", "favorite is celery", "corn")
name <- c("Carlie", "Daniel", "Ellen", "Theo", "CiCi")
df <- as.data.frame(cbind(name, favoriteFruit, favoriteVeg), stringsAsFactors = FALSE)
head(df)
 name      favoriteFruit        favoriteVeg
1 Carlie              apple             carrot
2 Daniel             banana             carrot
3  Ellen favorite is banana             celery
4   Theo         strawberry favorite is celery
5   CiCi  favorite is apple               corn

Теперь, если я хочу просмотреть фрейм данных и удалить все экземпляры «любимого есть», я могу использовать следующее:

cleanerFunc <- function(column) {
  new <- str_remove_all(column, "favorite is ")
  return(new)
}
df2 <- modify(df, cleanerFunc) %>%
  as.data.frame(stringsAsFactors = FALSE)
head(df2)
name favoriteFruit favoriteVeg
1 Carlie         apple      carrot
2 Daniel        banana      carrot
3  Ellen        banana      celery
4   Theo    strawberry      celery
5   CiCi         apple        corn

Создание этой функции похоже на шаг, который я должен пропустить, поскольку функция делает только одно (то есть говорит R использовать одну другую функцию). Мне кажется, что я должен иметь возможность пропустить создание функции и использовать str_remove_all напрямую с модификацией, но все мои попытки сделать это возвращают ошибки или пустые фреймы данных (см. Ниже).

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

Другие способы, которыми я пытался очистить свой фрейм данных:

df3 <- modify(df, str_remove_all("favorite is "))
df4 <- modify(df, str_remove_all(., "favorite is"))
df5 <- modify(df, str_remove_all(df, "favorite is"))
df6 <- df %>%
  modify(str_remove_all(., "favorite is"))
df7 <- df %>%
  modify(str_remove_all(., "favorite is")) %>%
  as.data.frame(stringsAsFactors = FALSE)

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

В соответствии с подсказкой ?purrr::modify необходимо указать функцию, формулу или атомный вектор.

Если функция, она используется как есть. Так что используйте

modify(df, str_remove_all, pattern="favorite is ")

Если формула, например, ~ .x + 2, он преобразуется в функцию. Таким образом попробуйте

modify(df, ~str_remove_all(.,"favorite is "))

Или просто используйте mutate

df %>% mutate_all(funs(str_remove_all(.,"favorite is ")))
0 голосов
/ 26 июня 2018

Это потому что str_remove_all подпись string, pattern. Это означает, что все ваши звонки на modify пытаются манипулировать одной и той же константой («любимым является»). Ваш подход (с cleanerFunc) является правильным способом решения проблемы.

...