将列名作为变量和列传递给R中的单个dplyr函数

By simon at 2018-02-07 • 0人收藏 • 56人看过

我在写一个代码,其中提供了一个列名(例如"Category") 用户并分配给一个变量biz.area。例如...

biz.area <- "Category"
原始数据框保存为risk.data.用户还提供 要分析的列的范围通过提供变量的列名 first.column和last.column。 这些栏目中的文字将会被分成两个部分或进一步的文字分析 包括tf_idf。 我的代码分析如下。
x.bigrams <- risk.data %>% 
  gather(fields, alldata, first.column:last.column) %>% 
  unnest_tokens(bigrams,alldata,token = "ngrams", n=2) %>% 
  count(bigrams, biz.area, sort=TRUE) %>%
  bind_tf_idf(bigrams, biz.area, n) %>%
  arrange(desc(tf_idf))
但是,我得到以下eRROR。

在groupeddfimpl(data,unname(vars),drop)中出错:列x.biz.area是 未知 这是因为count() expec列名称文本字符串而不是 变量biz.area.如果我使用count_(),我得到以下 错误。 Err或者在compatlazydots(vars,caller_env())中:找不到对象'bigrams' 这是因为count_()只能找到变量Bles和 bigrams不是一个变量。 我怎样才能通过一个常数和一个变量

x.bigrams <- risk.data %>% 
  gather(fields, alldata, first.column:last.column) %>% 
  unnest_tokens(bigrams,alldata,token = "ngrams", n=2) %>% 
  count(bigrams, biz.area, sort=TRUE) %>%
  bind_tf_idf(bigrams, biz.area, n) %>%
  arrange(desc(tf_idf))
61或 count_()? 钍感谢您的建议!

1 个回复 | 最后更新于 2018-02-07
2018-02-07   #1

它看起来像你需要附件,以便您可以传递列名称 作为变量,而不是字符串或值。硅你已经在使用了 dplyr,你可以使用[dplyr的非标准评估 技术](http://dplyr.tidyverse.org/articles/programming.html)。 尝试一下这些方面:

library(tidyverse)

analyze_risk  <- function(area, firstcol, lastcol) {

    # turn your arguments into enclosures
    areaq  <- enquo(area)
    firstcolq <- enquo(firstcol)
    lastcolq <- enquo(lastcol)

    # run your analysis on the risk data
    risk.data %>% 
      gather(fields, alldata, !!firstcolq:!!lastcolq) %>% 
      unnest_tokens(bigrams,alldata,token = "ngrams", n=2) %>% 
      count(bigrams, !!areaq, sort=TRUE) %>%
      bind_tf_idf(bigrams, !!areaq, n) %>%
      arrange(desc(tf_idf))
}
在这种情况下,您的用户会将裸露的列名传递给func重刑 这个:
myresults  <- analyze_risk(Category, Name_of_Firstcol, Name_of_Lastcol)
如果您希望用户传递字符串,则需要使用rlang::expr() enquo()。

登录后方可回帖

Loading...