сгладить список фреймов данных и извлечь переменную - PullRequest
2 голосов
/ 20 июня 2020

У меня есть коллекция mon go, которую я свернул в список фреймов данных. Примерно так:

have <- list(
    structure(list(var2 = c(0L, 0L, 0L), var3 = c(0.06, 0.05, 0.1), var1 = c("D", "B", "A")), class = "data.frame", row.names = c(NA, 3L)), 

    list(), 

    structure(list(var1 = c("A", "B", "C"), var2 = c(1L, 1L, 2L), var3 = c(0.08, 0.08, 0.5)), class = "data.frame", row.names = c(NA, 3L)), 

    structure(list(var3 = c(0.05, 0.5, 0.01), var1 = c("B", "C", "D"), var4 = c("X", "Y", "Z"), var2 = c(0L, 0L, 0L)), class = "data.frame", row.names = c(NA, 3L)), 

    structure(list(var2 = c(0L, 0L), var3 = c(0.025, 0.1), var1 = c("A", "C")), class = "data.frame", row.names = 1:2), 

    structure(list(var3 = 0.05, var1 = "B", var2 = 0L), class = "data.frame", row.names = 1L)
)

Обратите внимание, что второй элемент - это список длиной 0 и что размеры фрейма данных различаются. Я хочу извлечь var1 и порядок элементов списка. Для списка длиной 0 я хочу извлечь NA.

want <- data.frame(listID = seq(1:6), var1 = c("D, B, A", NA, "A, B, C", "B, C, D", "A, C", "B"))
want

#  listID    var1
#1      1 D, B, A
#2      2    <NA>
#3      3 A, B, C
#4      4 B, C, D
#5      5    A, C
#6      6       B

Ответы [ 4 ]

2 голосов
/ 20 июня 2020

Использование purrr и dplyr na_if:

library(purrr)
library(dplyr)

have %>%
  map(pluck, "var1") %>%
  map_chr(paste, collapse = ", ") %>%
  na_if("") %>%
  data.frame(listID = 1:length(.), var1 = .)
#>   listID    var1
#> 1      1 D, B, A
#> 2      2    <NA>
#> 3      3 A, B, C
#> 4      4 B, C, D
#> 5      5    A, C
#> 6      6       B

Создано 19.06.2020 с помощью пакета REPEX (v0.3.0)

1 голос
/ 20 июня 2020

Вот подход data.table:

library(data.table)
data.table(listID = seq_along(have), 
           var1 = vapply(have, function(x) toString(x[["var1"]]),
                  character(1L)))[var1 == "", var1 := NA_character_][]
#    listID    var1
# 1:      1 D, B, A
# 2:      2    <NA>
# 3:      3 A, B, C
# 4:      4 B, C, D
# 5:      5    A, C
# 6:      6       B
1 голос
/ 20 июня 2020

Вот подход с базовым R:

out.var1 <- lapply(have, "[", "var1")
var1 <- sapply(out.var1, function(x) paste(t(x), collapse=", "))
var1[var1=="NULL"] <- NA
listID <- seq_len(length(out.var1))
(want <- data.frame(listID, var1))
#   listID    var1
# 1      1 D, B, A
# 2      2    <NA>
# 3      3 A, B, C
# 4      4 B, C, D
# 5      5    A, C
# 6      6       B
0 голосов
/ 20 июня 2020

Вот базовый метод R с использованием sapply:

var1 <- sapply(have, function(x) toString(x$var1))
data.frame(listID = seq_along(have), var1)

#  listID    var1
#1      1 D, B, A
#2      2        
#3      3 A, B, C
#4      4 B, C, D
#5      5    A, C
#6      6       B

При необходимости вы можете заменить пустое значение на NA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...