我正在尝试学习purr
,因此我正在寻找与其相关的解决方案。
假设我有一个包含3个元素的列表,这些元素本身就是数据帧列表:
a1 <- data.frame(a = c('alfa', 'beta', 'omega'), b = rnorm(3,0,1), c = NA)
a2 <- data.frame(a = c('lambda', 'delta', 'epsilon'), b = rnorm(3,0, 1), c = NA)
b1 <- data.frame(a = c('lambda', 'delta', 'alfa'), b = rnorm(3, 1, 1), c = 1)
b2 <- data.frame(a = c('beta', 'delta', 'epsilon'), b = rnorm(3, 1, 2), c = c(0, 1, NA))
a <- list(a1, a2)
b <- list(b1, b2)
L <- list(a,b)
如何使用map*_
格式化L,以使所有第一列都转换为字符(我不需要知道任何一列都可能有因子的一般情况),而且还{ 1}}个被删除了吗?
由于嵌套的层次不只一个,因此我不知道如何在不嵌套的情况下调用函数。
答案 0 :(得分:2)
一个dplyr
和purrr
选项可以是:
map_depth(.x = L, 2, ~ .x %>%
mutate_at(1, as.character) %>%
na.omit())
[[1]]
[[1]][[1]]
[1] a b c
<0 rows> (or 0-length row.names)
[[1]][[2]]
[1] a b c
<0 rows> (or 0-length row.names)
[[2]]
[[2]][[1]]
a b c
1 lambda 0.6691767 1
2 delta 1.5106571 1
3 alfa 1.8121246 1
[[2]][[2]]
a b c
1 beta -0.4429880 0
2 delta -0.7539317 1
答案 1 :(得分:2)
出于完整性考虑,以及出于将来出于某种原因可能更愿意使用base
的用户,这里的base
解决方案假定所有数据帧都具有相同的名称:
lapply(L,lapply,function(x) na.omit(within(x,
{ a <-as.character(a)})))
[[1]]
[[1]][[1]]
[1] a b c
<0 rows> (or 0-length row.names)
[[1]][[2]]
[1] a b c
<0 rows> (or 0-length row.names)
[[2]]
[[2]][[1]]
a b c
1 lambda -0.7389969 1
2 delta 0.9791327 1
3 alfa 1.4097145 1
[[2]][[2]]
a b c
1 beta -0.3176996 0
2 delta 2.8242954 1
或者,如果名称在数据框之间不同,
lapply(L,lapply,function(x) na.omit(replace(x,1,as.character(x[,1]))))
注意:这可能不如purrr
解决方案灵活,因为您无法控制索引级别(即对于purrr
,您可以决定提高到一定深度)rapply
或lapply
本身可能有一种方法,但我不知道。
结果的结构:
List of 2
$ :List of 2
..$ :'data.frame': 0 obs. of 3 variables:
.. ..$ a: chr(0)
.. ..$ b: num(0)
.. ..$ c: logi(0)
.. ..- attr(*, "na.action")= 'omit' Named int [1:3] 1 2 3
.. .. ..- attr(*, "names")= chr [1:3] "1" "2" "3"
..$ :'data.frame': 0 obs. of 3 variables:
.. ..$ a: chr(0)
.. ..$ b: num(0)
.. ..$ c: logi(0)
.. ..- attr(*, "na.action")= 'omit' Named int [1:3] 1 2 3
.. .. ..- attr(*, "names")= chr [1:3] "1" "2" "3"
$ :List of 2
..$ :'data.frame': 3 obs. of 3 variables:
.. ..$ a: chr [1:3] "lambda" "delta" "alfa"
.. ..$ b: num [1:3] -0.739 0.979 1.41
.. ..$ c: num [1:3] 1 1 1
..$ :'data.frame': 2 obs. of 3 variables:
.. ..$ a: chr [1:2] "beta" "delta"
.. ..$ b: num [1:2] -0.318 2.824
.. ..$ c: num [1:2] 0 1
.. ..- attr(*, "na.action")= 'omit' Named int 3
.. .. ..- attr(*, "names")= chr "3"