为什么 stringr 和 purrr 函数只能在我创建函数时一起使用?

Why do stringr and purrr functions only work together when I create a function?

在处理基于文本的数据框时,我注意到函数 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

现在,如果我想遍历数据框并删除 "favorite is," 的所有实例,我可以使用以下命令:

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 进行修改,但我所有尝试这样做 return 错误或空数据帧(见下文)。

显然,创建函数是一个非常简单的解决方法,所以我问这个问题主要是因为我想知道我误解了什么让我认为我可以跳过这一步。谁能解释一下 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)

那是因为str_remove_all的签名是string, pattern。这意味着您对 modify 的调用都试图操纵相同的常量 ("favorite is")。您的方法(使用 cleanerFunc)是解决问题的有效方法。

根据帮助?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 ")))