cbind список фрейма данных и вектор списка

скажем, у меня есть вложенный список с data.frame с именем list_df_A, который имеет следующую структуру:

$ :'data.frame':      1 obs. of 3 variables:
  ..$ a             :chr a1
  ..$ b             :chr b1
  ..$ c             :chr c1

$ :'data.frame':      3 obs. of 3 variables:
  ..$ a             :chr [1:3] a21 a22 a23
  ..$ b             :chr [1:3] b21 b22 b23
  ..$ c             :chr [1:3] c21 c22 c23

$ :'data.frame':      1 obs. of 3 variables:
  ..$ a             :chr a3
  ..$ b             :chr b3
  ..$ c             :chr c3

поэтому, если я привяжу их к data.table / data.frame:

list_df_A <- rbindlist(list_df_A)

list_df_A будет выглядеть так:

      a     b     c
1:   a1    a2    a3
2:  a21   b21   c21
3:  a22   b22   c22
4:  a23   b23   c23
5:   a3    b3    c3

Теперь у меня есть другой список. Этот список на самом деле является корнем файла json. Позвольте мне назвать этот список list_root, который имеет следующую структуру:

chr [1:3] "type1" "type2" "type3"

если я сделаю это как data.table / data.frame:

list_root <- as.data.table(list_root)

Я получаю эту таблицу

       V1
1:  type1
2:  type2
3:  type3

Теперь возникает вопрос: я знаю, что type2 в list_root имеет 3 записи в list_df_A. Это потому, что каждый "тип" относится к одному фрейму данных в list_df_A

Как вы сообщите R, когда он свяжет две таблицы data.table вместе, он покажет что-то вроде этого?

           V1       a     b     c
     1: type1      a1    a2    a3
     2: type2     a21   a21   a21
     3: type2     b22   b22   b22
     4: type2     c23   c23   c23
     5: type3      a3    b3    c3

В каком-то смысле строка 2,3,4 принадлежит type2?


person Gabriel    schedule 14.02.2018    source источник
comment
Нет ли rbindlist аргумента idcol, который исключает имена переданного вами списка? Именно для этой цели?   -  person joran    schedule 14.02.2018
comment
... и почему вы продолжаете ссылаться на cbind, если все, что вы делаете, - это привязка строк?   -  person joran    schedule 14.02.2018
comment
Когда я упоминаю cbind, я хочу упомянуть привязку столбца. как и последний фрейм данных. вы можете видеть, что первый столбец в последнем фрейме данных находится в списке list_root, а второй столбец - в списке list_df_A.   -  person Gabriel    schedule 14.02.2018
comment
Ах. Что ж, тогда я просто сделаю тот список, с которого вы начинаете, называться list и использовать idcol в rbindlist, и вы должны быть настроены.   -  person joran    schedule 14.02.2018
comment
Когда вы упоминаете rbindlist с помощью idcol, у меня возникла идея. Для list_root я использую rbindlist (list_root, use.names = TRUE, fill = TRUE, idcol = TRUE). Затем для list_df_A я использую rbindlist (list_df_A, use.names = TRUE, fill = TRUE, idcol = TRUE). Теперь оба фрейма данных имеют столбец .id. Затем я могу использовать, например, data.frame, чтобы объединить их вместе с помощью .id. Как слияние (list_df_A, list_root, on = .id).   -  person Gabriel    schedule 14.02.2018
comment
Я не могу создать .id для list_root, потому что это не rbind из многих списков. Есть ли способ сгенерировать .id?   -  person Gabriel    schedule 14.02.2018
comment
Я не понимаю, зачем вы делаете что-то такое сложное. names(list_df_A) <- list_root; rbindlist(list_df_A,idcol = "id") и все готово.   -  person joran    schedule 14.02.2018


Ответы (3)


До rbindlist вы можете предоставить каждому фрейму данных внешний вектор идентификаторов, используя mapply

my_list <- mapply(`[<-`, my_list, 'colname', value = list_root , SIMPLIFY = FALSE)

А затем просто свяжите их всех.

person Felipe Alvarenga    schedule 14.02.2018
comment
Вы можете задать все имена списка в одной строке, просто выполнив names(my_list) <- character_vector_of_names. Нет необходимости в mapply. - person joran; 14.02.2018

Мой ответ на это:

Мы используем .id в качестве ключа для объединения двух фреймов данных / данных вместе.

для list_root мы сначала преобразуем его в формат данных, затем добавляем столбец с ".id", чтобы у нас был ключ:

list_root <- as.data.table(list_root)[, .id := seq(1, nrow(list_root),1)]

Затем я могу использовать rbindlist для list_df_A:

list_df_A <- rbindlist(list_df_A, use.names=TRUE, fill=TRUE, idcol=TRUE)

Теперь у обоих есть общий ключ ".id", и мы можем выполнить слияние:

new_dt <- merge(list_root, list_df_A, on=".id")

И получаем требуемый результат:

       V1       a     b     c    .id
 1: type1      a1    a2    a3      1
 2: type2     a21   a21   a21      2
 3: type2     b22   b22   b22      2
 4: type2     c23   c23   c23      2
 5: type3      a3    b3    c3      3
person Gabriel    schedule 14.02.2018

Вы устанавливаете имена своего списка, а затем используете аргумент idcol следующим образом:

names(list_df_A) <- list_root
rbindlist(list_df_A,idcol = "id")
person joran    schedule 14.02.2018