Форматировать список списков данных - PullRequest
2 голосов
/ 03 февраля 2020

Я пытаюсь выучить 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)

Как я могу отформатировать L, используя map*_ таким образом, чтобы все первые столбцы были преобразованы в символ (я делаю не нужно знать общий случай, в котором любой столбец может иметь факторы), а также такие, что NA s удаляются?

Поскольку существует более одного уровня вложенности, я не знаю, как вызвать работает, ничего не отменяя.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

Для полноты картины и для будущих пользователей, которые могут предпочесть придерживаться 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 вы можете решить go до определенной глубины.) Возможно, есть способ с 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"
2 голосов
/ 03 февраля 2020

Один 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...