如何解决在 R 中的函数内使用 unnest_tokens() 会导致错误
我想在另一个函数中使用 tidytext 中的 unnest_tokens 函数。
由于我传递的数据框中的列名可能每次都不同,我尝试使用 [[x]] 来寻址列,我已经在另一个函数中成功使用了它,但在这里它不起作用。
这是我使用的代码:
f1 <- function(df) {
df2 <- df %>%
unnest_tokens(df[[3]],df[[2]])
return(df2)
}
data <- structure(list(Id = 1,Description = "Lorem ipsum dolor sit amet"),row.names = 1L,class = "data.frame")
result <- f1(data)
执行此操作时我得到
Fehler während wrapup: Input must be a character vector of any length or a list of character
vectors,each of which has a length of 1.
Error: no more error handlers available (recursive errors?); invoking 'abort' restart
解决方法
unnest_tokens
的第二个参数是 output
列名。它可以是任何列名。因此,我们可以将其称为“单词”,第三个参数是输入列名称。这是“描述”。
library(tidytext)
library(dplyr)
data %>%
unnest_tokens(word,Description)
在函数中执行此操作的一种方法是将列名作为参数传递。使用 tidyverse
,选项是使用卷曲操作符({{}}
- 如果我们只想传递不带引号的参数),或者另一个选项使用 sym
转换为 ensym
bol并评估 (!!
) - 优点是它可以采用带引号或不带引号的列名
f1 <- function(dat,nm) {
dat %>%
unnest_tokens(word,!! ensym(nm))
}
out1 <- f1(data,Description)
out2 <- f1(data,'Description')
identical(out1,out2)
#[1] TRUE
out1
# Id word
#1 1 lorem
#1.1 1 ipsum
#1.2 1 dolor
#1.3 1 sit
#1.4 1 amet
如果应该是基于列的位置并且是固定的,那么函数就只能取数据对象了
f2 <- function(dat) {
dat %>%
unnest_tokens(word,!! rlang::sym(names(dat)[2]))
}
out3 <- f2(data)
identical(out1,out3)
#[1] TRUE
,
将要取消嵌套的列名作为参数传递给函数,并使用 .data
在函数中引用它。
library(tidytext)
library(dplyr)
f1 <- function(df,col) {
df %>% unnest_tokens(word,.data[[col]])
}
f1(data,'Description')
# Id word
#1 1 lorem
#1.1 1 ipsum
#1.2 1 dolor
#1.3 1 sit
#1.4 1 amet
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。