函数适用于数据框,但在使用lapply时会出错

时间:2019-12-15 22:32:00

标签: r lapply

我正在尝试使用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时,我将在许多数据帧上使用它。我认为在示例中没有什么不同-尝试在多个数据帧上执行此操作时出现相同的错误。我认为我缺少明显的东西。

1 个答案:

答案 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