代码之家  ›  专栏  ›  技术社区  ›  Forever

在应用中使用dplyr函数

  •  0
  • Forever  · 技术社区  · 6 年前

    我想在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是一个非常大的对象,它与for cycles一起工作,但我正在尝试用apply函数替换它们。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Colin FAY    6 年前

    使用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
  •  2
  •   thc    6 年前

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

    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"
    

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

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