Объединить список данных в R - PullRequest
0 голосов
/ 02 мая 2020

У меня есть список данных в R, например:

w = list(structure(list(var = structure(c(1L, 1L, 2L, 3L), .Label = c("A", 
"B", "C"), class = "factor"), val = 1:4), class = "data.frame", row.names = c(NA, 
-4L)), structure(list(var = structure(c(1L, 2L, 3L, 1L), .Label = c("A", 
"B", "C"), class = "factor"), val = 101:104), class = "data.frame", row.names = c(NA, 
-4L)))

Я хотел бы объединить эти данные в var. пытаюсь:

Reduce(function(dtf1, dtf2) merge(dtf1, dtf2, by = "var", all.x = T),w)

  var val.x val.y
1   A     1   101
2   A     1   104
3   A     2   101
4   A     2   104
5   B     3   102
6   C     4   103

Но это не то, что я ищу! Я хотел бы иметь результат как:

 var val val.x
  A   1   101
  A   2   104
  B   3   102
  C   4   103

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Вы неявно присоединяетесь к идентификатору строки в каждой группе. Было бы проще сделать эту явную переменную более простой.

Простой способ создать эту переменную - data.table::rowid():

w <- lapply(w, function(x) {x$id <- data.table::rowid(x$var); x})
Reduce(function(dtf1, dtf2) merge(dtf1, dtf2, by = c("var", "id"), all.x = T), w)
  var id val.x val.y
1   A  1     1   101
2   A  2     2   104
3   B  1     3   102
4   C  1     4   103
0 голосов
/ 02 мая 2020

Вы можете создать отдельный столбец id в каждом списке, а затем merge их вместе.

Reduce(function(dtf1, dtf2) merge(dtf1, dtf2, by = c("var", "id"), all.x = TRUE),
   lapply(w, function(x) transform(x, id = ave(val, var, FUN = seq_along))))


#  var id val.x val.y
#1   A  1     1   101
#2   A  2     2   104
#3   B  1     3   102
#4   C  1     4   103

В tidyverse тот же лог c можно применить, используя:

library(dplyr)
library(purrr)

map(w, ~.x %>% group_by(var) %>% mutate(id = row_number())) %>%
    reduce(left_join, by = c("var", "id"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...