#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. Да, я пробовал это раньше, но мне нужно связать строки, теперь столбцы. Когда я пытаюсь связать строки, я получаю сообщение об ошибке, потому что каждое последующее время и вертикаль имеют разный пробный номер, поэтому появляется ошибка имени. могу ли я удалить имя и просто использовать вместо него столбец идентификатора?