Отображение переменных из 2 списков и сохранение их в отдельных фреймах данных

#r #dataframe #mapping #nested-lists #purrr

#r #фрейм данных #отображение #вложенные списки #муррр

Вопрос:

У меня есть список из 14 прыжковых испытаний серии times. 14 со временем и 14 с расстоянием по вертикали, как показано в списке, как бы я использовал MAP вместо ЦИКЛА, чтобы связать каждую соответствующую временную и вертикальную пробу как hop1, hop2, hop3 и т. Д. И поместить их в основной фрейм данных?

список dt и dv

введите описание изображения здесь

образец будет выглядеть следующим образом:

 hop1 <-data.frame(hop =1,t = dt$time_100L_1, v = dv$vertical_100L_1)

hop2 <-data.frame(hop =2,t = dt$time_100L_2, v = dv$vertical_100L_2)
 

и храните весь хмель в мастере. Могу ли я связать список из 2 строк и указать идентификатор перехода для каждого типа в образце?

Я использую этот код,

сначала сопоставьте первый элемент, извлеченный как data.frame/tibble, чтобы связать столбцы для формирования нового списка

 combined_hop <- purrr::map2(d100Lt, d100Lv, ~data.frame(.x, .y)) %>% 
  # use ldply() as it will use the list names as a column we can use as ID
  plyr::ldply(tibble) %>% 
  # group by this newly generated ID
  dplyr::group_by(.id) %>% 
  # build new group ID (you could build it from your column names
  dplyr::mutate(G_ID = dplyr::cur_group_id()) %>% 
  # ungroup the tibble
  dplyr::ungroup() %>% 
  # select renaming the columns of interest (dropping the intermediate ID)
  dplyr::select(ID = G_ID, TIME = .x, Vertical = .y)
 

это работает, но я получаю идентификатор столбца не по порядку, в то время как 2-й и 3-й столбцы верны.
новый фрейм данных

есть какие-нибудь предложения, как получить правильный заказ?

Ответ №1:

Насколько я понимаю, у вас есть два списка, где каждый представляет собой фрейм данных / tibble, и оба имеют одинаковые размеры. Если столбцы расположены в одинаковом порядке, возможным решением будет следующее:

 library(dplyr)
library(purrr)
library(plyr)

# demo lists
dt <- list(data.frame(a1 = c(1, 1),
                      a2 = c(2, 2),
                      a3 = c(3, 3)))

dv <- list(data.frame(b1 = c(111, 111),
                      b2 = c(222, 222),
                      b3 = c(222, 222)))

# first map the first element extracted as data.frame/tibble to bind columns to form a new list
purrr::map2(dt[[1]], dv[[1]], ~data.frame(.x, .y)) %>% 
# use ldply() as it will use the list names as a column we can use as ID
  plyr::ldply(tibble) %>% 
# group by this newly generated ID
  dplyr::group_by(.id) %>% 
# build new group ID (you could build it from your column names
  dplyr::mutate(G_ID = dplyr::cur_group_id()) %>% 
# ungroup the tibble
  dplyr::ungroup() %>% 
# select renaming the columns of interest (dropping the intermediate ID)
  dplyr::select(ID = G_ID, VELO = .x, TIME = .y)

# A tibble: 6 x 3
     ID  VELO  TIME
  <int> <dbl> <dbl>
1     1     1   111
2     1     1   111
3     2     2   222
4     2     2   222
5     3     3   222
6     3     3   222
 

Комментарии:

1. Так что это сработало очень хорошо. Он помещает столбцы и строки для каждого перехода, единственная странность — это то, что столбец идентификаторов переходит с 1 на 7-14, а затем обратно на 2-6 … не уверен, как это работает. Я запускал его несколько раз, и каждый раз это происходило так. Время и вертикальное положение по-прежнему совпадают, хотя для всех 14 испытаний

2. вы имеете в виду «.id» или «G_ID» или оба? (вы можете сохранить их оба, просто пропустив последнюю строку «dplyr:: select ()» и оператор канала перед сравнением)

3. предоставленный вами код работает, но столбец ID идет 1,7,8,9,10,11,12,13,14,2,3,4,5,6, в то время как столбцы time и vertical имеют правильный порядок. Я отредактировал сообщение и предоставил картинку с кодом, который вы предложили. Блестящий кстати. Спасибо

Ответ №2:

Вы можете попробовать с Map :

 result <- Map(cbind, hop  = seq_along(dt), t = dt, v = dv)
 

Если dt и dv находятся внутри списка, вы можете сделать :

 result <- Map(cbind, hop  = seq_along(dt[[1]]), t = dt[[1]], v = dv[[1]])
 

Комментарии:

1. Но мне нужно связать строки, а не столбцы. Сложите их один поверх другого в три столбца. Столбец идентификатора, столбцы времени и вертикальный столбец в новом фрейме данных. Я пробовал это, но у меня возникла ошибка с rbind, и имена проб не совпадают, поэтому он не будет привязывать строки следующего испытания к столбцам выше с другим именем испытания, которое находится в dt и dv.

2. @AaronSanchez Попробуйте сделать result <- do.call(rbind, result)

Ответ №3:

Мы также можем сделать

  do.call(Map, c(f = cbind, c(list(hop = seq_along(dt)), do.call(c, list(dt, dv)))))
 

Комментарии:

1. Да, я пробовал это раньше, но мне нужно связать строки, теперь столбцы. Когда я пытаюсь связать строки, я получаю сообщение об ошибке, потому что каждое последующее время и вертикаль имеют разный пробный номер, поэтому появляется ошибка имени. могу ли я удалить имя и просто использовать вместо него столбец идентификатора?