【问题标题】:In R how to pass a column as parameter to strsplit?在R中如何将列作为参数传递给strsplit?
【发布时间】:2020-01-05 02:29:48
【问题描述】:

将列作为参数传递给 str_split 函数并将其识别为列的正确方法是什么?

library(tidyverse)
library(lazyeval)
df = data.frame("x"=c("apple/pear","pear/banana/kiwi","orange/pear"))
function (col) {
  mtcars %>%  
  select(col) %>% 
  transform(col = interp(strsplit(~v, "/"), v=as.name(col)) )
}

当前返回错误'strsplit(~v, "-") 中的错误:非字符参数'

【问题讨论】:

  • 您使用的基本strsplit 函数需要字符向量输入。从?strsplit“其他输入,包括一个因子,将给出错误。”所有mtcars 列都是数字,而不是字符。因此出现错误“非字符参数”。如果你切换到stringr::str_split,就像你的标题一样,你可能会成功。否则,在拆分之前转换为character
  • 前面的例子没有经过深思熟虑。我添加了一个虚拟数据框来说明问题
  • 如何在函数外运行这段代码?

标签: r tidyverse


【解决方案1】:

我们可以使用tidyverse 选项而不是将base R 与tidyverse 混合使用。 separate_rows 来自 tidyr 拆分列并将其重塑为“长”格式。在函数内部,我们可以使用 curly-curly 运算符 ({{}}) 来评估函数的未引用参数

library(dplyr)
library(tidyr)
f1 <- function(data, col) {
           data %>%
                separate_rows({{col}}, sep="/")
   }

f1(df, x)

【讨论】:

  • 太棒了。 {{}} 是传递参数并将其识别为列的符号吗?
  • @santoku 是的,这是一种结合!! enquo(col)的紧凑方式