【发布时间】:2016-12-29 20:11:43
【问题描述】:
我创建的代码将采用输入向量、基于输入创建数据框、优化一些值并返回其中一些值。我现在将其转换为一个函数,该函数将在输入数据帧上逐行应用计算。下面是我想要实现的最小工作示例(我的实际功能太长,无法在这里分享!):
# Randomly generated dataframe
df <- data.frame(a = rnorm(10, 0, 1), x = rnorm(10, 1, 3), y = rnorm(10, 2, 3))
# Function that takes multiple arguments and returns multiple values in a list
zsummary <- function(x, y) {
if (y < 0) return(list(NA, NA))
z = rnorm(10, x, abs(y))
return(list(mean(z), sd(z)))
}
# Example of something that works using dplyr
# However, this results in a lot of function calls...
# especially if there were a lot of columns in the list...
library(dplyr)
df %>% rowwise() %>%
mutate(mean = zsummary(x,y)[[1]], sd = zsummary(x,y)[[1]])
如您所见,我无法将单独的函数应用于每个新的 df$mean 和 dfsd 列,因为它们依赖于只能生成一次的 z 向量。我已经环顾四周了,但我还没有找到答案。我认为解决方案是使用apply 函数之一,而不是dplyr 的函数,但老实说,我从来没有完全理解apply 函数。我也不喜欢使用 for 循环和 rbind 的解决方案,因为我在以前的项目中尝试过这个,对于大型数据帧它变得非常慢!
【问题讨论】: