【问题标题】:do.call for all dataframe columns with lazy evaluation and dplyr functiondo.call 用于所有具有惰性求值和 dplyr 函数的数据框列
【发布时间】:2017-05-09 09:13:54
【问题描述】:

我的问题类似于enter link description hereenter link description here,但我的问题更复杂,因为它需要多个 dplyr 操作和惰性求值。

这是我的功能:

stats <- function(col_names){
require("dplyr")
data %>% 
group_by_(col_names) %>%
summarise(Count = n()) %>%
mutate(Percent = prop.table(Count)) -> temp
write.csv(temp, file=paste(col_names,".csv",sep="_"))}

然后,我想将每个列名作为参数传递给 do.call。

colnames <- names(data)

do.call(stats, as.list(col_names))

但我遇到一个常见错误:

Error in (function (col_names)  : 
unused arguments           ("loans_approved_amount_limit_in_account", "loans_approved_amount_limit_in_ron")

如果我单独输入列名,该功能将起作用。但是我必须超过 1000 列,所以我需要自动化这个过程。

【问题讨论】:

  • 恐怕没有链接。
  • 你为什么使用do.call?你的函数只接受一个参数。您在寻找lapply 吗?此外,您还缺少}
  • 抱歉,刚刚修复了链接。我使用 do.call 是因为我想传递一个参数列表,这些参数是数据框的 1000 多个列名。不知道为什么要这样做。
  • 您知道summarize_allmutate_all 也可以用于相同的目的,而无需lapply

标签: r function dplyr lazy-evaluation


【解决方案1】:

do.call 用于为函数的单个 执行提供多个函数参数。例如,我们可以使用参数列表来代替paste('c', 1:2),这样do.call(paste, list('c', 1:2)) 会给出相同的结果。

因此,在您的情况下,do.call 与运行 stats(col1, col2, col3, ...) 相同。您可以很容易地看到这不起作用,因为stats 只接受一个参数。这就是为什么你得到的错误是关于未使用的参数。

您想要做的是使用单个参数运行您的函数多次次。一种方法是lapply

lapply(names(data), stats)

【讨论】:

  • 谢谢!我试过:lapply(col_names, stats),但显然我错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2017-07-28
相关资源
最近更新 更多