преобразовать список векторов во фрейм данных - PullRequest
5 голосов
/ 29 апреля 2020

У меня есть список векторов. этот вектор состоит из имен A1, A2 .. и цифр c значений:

a <- list()
a$`p1`["A1"] <- 1
a$`p1`["A2"] <- 0.5
a$`p1`["A3"] <- 0.3
a$`p2`["A3"] <- 2
a$`p2`["A4"] <- 2.5
a$`p2`["A5"] <- 2.3

I wi sh для преобразования его во фрейм данных со следующей структурой

P <- c("p1","p1","p1","p2","p2","p2")
A <- c("A1","A2","A3","A3","A4","A5")
V <- c(1,0.5,0.3,2,2.5,2.3)
out <- data.frame(P,A,V)

Спасибо:)

Ответы [ 4 ]

3 голосов
/ 29 апреля 2020

Один purrr и tibble параметр может быть:

map_dfr(a, ~ enframe(., name = "A", value = "V"), .id = "P")

  P     A         V
  <chr> <chr> <dbl>
1 p1    A1      1  
2 p1    A2      0.5
3 p1    A3      0.3
4 p2    A3      2  
5 p2    A4      2.5
6 p2    A5      2.3
3 голосов
/ 29 апреля 2020
df_list = lapply(a, function(x) data.frame(A = names(x), V = x, stringsAsFactors = FALSE))
dplyr::bind_rows(df_list, .id = "P")
#    P  A   V
# 1 p1 A1 1.0
# 2 p1 A2 0.5
# 3 p1 A3 0.3
# 4 p2 A3 2.0
# 5 p2 A4 2.5
# 6 p2 A5 2.3

Мне нравится способ выше, но вот вариант, который может быть более эффективным в большом списке:

data.frame(V = unlist(a)) %>% 
  tibble::rownames_to_column() %>%
  tidyr::separate(rowname, into = c("P", "A"))
2 голосов
/ 29 апреля 2020

Опция с base R

do.call(rbind, Map(cbind, lapply(a, stack), P = names(a)))
2 голосов
/ 29 апреля 2020

В базе-R

cbind(stack(a),A=unlist(lapply(a,names),use.names = F))

т

  values ind  A
1    1.0  p1 A1
2    0.5  p1 A2
3    0.3  p1 A3
4    2.0  p2 A3
5    2.5  p2 A4
6    2.3  p2 A5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...