我正在尝试使用lapply在多个数据帧上应用函数。当我分别在每个数据帧上调用该函数时,该函数都起作用,但是lapply抛出错误。该错误似乎无关紧要。我无法解决问题所在。这是一个示例:
a <- data.frame('country' = factor(c(rep(1, 5), rep(2, 5))),
'variable' = factor(c(rep('A', 5), rep('B', 5))),
'value' = runif(10, 0, 1),
'year' = runif(10, 0, 1))
slope <- function(dat) {
dat %>%
filter(!value %in% c(-66, -77, -88) & !is.na(value)) %>%
group_by(country, variable) %>%
do(data.frame(slope = coef(lm(value ~ year, .))[2])) %>%
ungroup()
}
此功能有效:
> slope(a)
# A tibble: 2 x 3
country variable slope
<fct> <fct> <dbl>
1 1 A 0.140
2 2 B -0.150
但是lapply不会:
> lapply(a, slope)
Error in UseMethod("filter_") :
no applicable method for 'filter_' applied to an object of class "factor"
我不明白该错误,因为过滤后的值是数字(不是因素)。
> str(a)
'data.frame': 10 obs. of 4 variables:
$ country : Factor w/ 2 levels "1","2": 1 1 1 1 1 2 2 2 2 2
$ variable: Factor w/ 2 levels "A","B": 1 1 1 1 1 2 2 2 2 2
$ value : num 0.884 0.513 0.835 0.83 0.694 ...
$ year : num 0.4288 0.2874 0.0531 0.7793 0.0496 ...
很显然,在实践中使用lapply时,我将在许多数据帧上使用它。我认为在示例中没有什么不同-尝试在多个数据帧上执行此操作时出现相同的错误。我认为我缺少明显的东西。
答案 0 :(得分:0)
问题在于,在lapply
上应用data.frame
会循环遍历各列,因为column是data.frame中的一个单位,即输出是{{1}的list
} s,而不是vector
,而data.frame
函数期望slope
带有要作用的列。
此外,OP提到在多个data.frame
上应用该功能。在这种情况下,请将数据集放在data.frame
中,并应用list
,即
lapply
或者使用单个数据集,用list(a, a) %>%
lapply(slope)
list
或者在list(a) %>%
lapply(slope)
tidyverse