微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 R 中的函数内使用 unnest_tokens() 会导致错误

如何解决在 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 转换为 ensymbol并评估 (!!) - 优点是它可以采用带引号或不带引号的列名

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 举报,一经查实,本站将立刻删除。