【问题标题】:Using dplyr functions inside apply在 apply 中使用 dplyr 函数
【发布时间】:2023-03-08 18:29:02
【问题描述】:

我想在 apply 中使用 dplyr 函数,用于矩阵 (BRCK) 的每个元素,这是一个数据帧矩阵。 我尝试过这样的事情:

apply(BRCK, c(1,2), function(x) dplyr::select(x, dplyr::contains("_01_"), 1) %>%
                                dplyr::filter((month(`BRCK[[la, lo]]`) == 1)) %>% 
                                dplyr::select(-contains("BRCK")) 

但它会返回

Error: Variable context not set 

还有回溯:

13. stop(cnd) 
12. abort("Variable context not set") 
11. cur_vars_env$selected %||% abort("Variable context not set") 
10. current_vars() 
9. tolower(vars) 
8. dplyr::contains("_01_") 
7. select.list(x, dplyr::contains("_01_"), 1) 
6. dplyr::select(x, dplyr::contains("_01_"), 1) 
5. eval(lhs, parent, parent) 
4. eval(lhs, parent, parent) 
3. dplyr::select(x, dplyr::contains("_01_"), 1) %>% dplyr::filter(x, 
(month(`BRCK[[la, lo]]`) == 1)) %>% dplyr::select(x, -contains("BRCK")) 
2. FUN(newX[, i], ...) 
1. apply(BRCK, c(1, 2), function(x) dplyr::select(x, dplyr::contains("_01_"), 1) %>% dplyr::filter(x, (month(`BRCK[[la, lo]]`) == 1)) %>% 
dplyr::select(x, -contains("BRCK"))) 

BRCK 是一个非常大的对象,它适用于循环,但我试图用应用函数替换它们。

【问题讨论】:

  • 使用管道或写出第一个参数,而不是两者
  • 好的,已更改,但同样的错误仍然存​​在。
  • 我们什么时候可以将 data.frames 存储在矩阵中?
  • 为什么不呢?如果这是我不知道的问题

标签: r dplyr apply


【解决方案1】:

使用 apply,x 在函数中作为列表传递,dplyr 仅处理数据帧。

apply(BRCK, c(1,2), is.data.frame)
      [,1]  [,2]  [,3]
[1,] FALSE FALSE FALSE
[2,] FALSE FALSE FALSE
[3,] FALSE FALSE FALSE

but :

apply(BRCK, c(1,2), function(x) is.data.frame(x[[1]]))
     [,1] [,2] [,3]
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE TRUE TRUE

so : 

library(tidyverse)
apply(BRCK, c(1,2), 
      function(x) {
        x[[1]] %>%
          dplyr::select(dplyr::contains("_01_"), 1) %>%
          dplyr::filter(lubridate::month(`BRCK[[la, lo]]`) == 1) %>% 
          dplyr::select(-contains("BRCK")) 
      }
)

【讨论】:

    【解决方案2】:

    一个问题是循环中的每个元素都是单个数据框的列表,而不是实际的数据框。比较:

    apply(BRCK, c(1,2), function(x) {
      class(x)
    }) 
    
         [,1]   [,2]   [,3]  
    [1,] "list" "list" "list"
    [2,] "list" "list" "list"
    [3,] "list" "list" "list"
    
    apply(BRCK, c(1,2), function(x) {
      class(x[[1]])
    }) 
    
         [,1]         [,2]         [,3]        
    [1,] "data.frame" "data.frame" "data.frame"
    [2,] "data.frame" "data.frame" "data.frame"
    [3,] "data.frame" "data.frame" "data.frame"
    

    我建议不要使用应用循环(而是在索引上使用 lapply),因为应用子集对象和修改它们的方式没有得到很好的记录。

    我还建议不要将 data.frames 存储在矩阵中。您可以将它们存储在列表中,并为矩阵索引隐含的元数据设置属性。

    【讨论】:

    • 好建议,我曾想过这样做(将数据框存储在列表中)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多