【发布时间】:2019-03-13 14:56:15
【问题描述】:
我对 mutate 和自写函数有疑问。我的数据基本如下:
license_sets <- list(x = c("A", "B"), y = c("C", "D", "E"))
license_data <- data.frame(license = c("A","B","C","D","E"), bidder = c("x","x","y","y","y"))
source_data <- expand.grid(license_i = c("A","B","C","D","E"), license_j = c("A","B","C","D","E"))
source_data$value <- c(1:25)
我要应用的函数如下:
compute_set <- function(i, J){ tmp <- source_data %>%
filter(license_i == i, license_j %in% J)
return(sum(tmp$value))
}
我现在想通过 mutate 应用函数:
license_data %>% mutate(z = compute_set(license, license_sets[[bidder]]))
我收到以下错误和警告消息:
Error in mutate_impl(.data, dots) :
Evaluation error: Evaluation error: recursive indexing failed at level 2
..
In addition: Warning messages:
1: In is.na(e1) | is.na(e2) :
longer object length is not a multiple of shorter object length
2: In `==.default`(license_i, i) :
longer object length is not a multiple of shorter object length
如果我用一个简单的 for 循环运行相同的函数,它完全可以正常工作。有谁知道这里有什么问题?它必须与变异有关,对吧?我也已经尝试过 as.character(bidder) 和我在这里找到的其他东西,但到目前为止没有任何效果。 我应该补充一点,我正在处理的数据框比我在这里显示的数据框大得多,所以 for 循环是不可行的......(因此我也感谢函数的简化提示;))
【问题讨论】:
-
您的函数未矢量化。这就是为什么它可以在 for 循环中正常工作,但它不会神奇地在 dplyr mutate-statement 中进行矢量化。
-
添加
rowwise()