[英]Using dplyr functions inside apply
我想在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是一个非常大的对象,它可用于循环,但我正在尝试将它们替换为apply函数。
使用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"))
}
)
一个问题是循环中的每个元素都是单个数据帧的列表,而不是实际数据帧的列表。 相比:
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循环(而是在索引上使用lapply),因为应用子集对象并修改它们的方式没有得到很好的记录。
我也建议不要将data.frames存储在矩阵中。 您可以将它们存储在列表中,并为矩阵索引所隐含的元数据设置属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.