Если мы следуем тому же параметру, что и в методе попытки OP, то есть изменим формат на «long» каждого набора данных в list
, затем l oop с imap
, создайте имя list1
элемент в качестве нового столбца, используйте pivot_longer
для преобразования в «длинный» формат, затем создайте столбец последовательности по группам и измените в «широкий» формат с помощью pivot_wider
library(dplyr)
library(tidyr)
library(purrr)
imap_dfr(all_data, ~
.x %>%
mutate(grp = .y) %>%
pivot_longer(cols = -c(name, grp),
names_to = "fruit", values_to = "Value")) %>%
#group_by(name, grp, fruit) %>%
#mutate(rn = row_number()) %>%
pivot_wider(names_from = grp, values_from = Value)
Или сделайте это более эффективно, привязав все наборы данных к одним данным с помощью bind_cols
, выполните pivot_longer
, удаляя отсутствующие значения с помощью value_drop_na = TRUE
, а затем сделайте то же самое, что и в приведенном выше решении
bind_rows(all_data, .id = 'grp') %>%
pivot_longer(cols = c(-name, -grp), names_to = "fruit",
values_to = "Value", values_drop_na = TRUE) %>%
# sequence column creation is not really required for the example
# as there are no duplicates
#group_by(name, grp, fruit) %>%
#mutate(rn = row_number()) %>%
pivot_wider(names_from = grp, values_from = Value)
Обновление
На основании новых данных с некоторым смешением в типах столбцов, если нам нужно, чтобы значения, такие как "AB", оставались такими же, их необходимо преобразовать в character
class
imap_dfr(all_data, ~
.x %>%
mutate_at(-1, as.character) %>%
mutate(grp = .y) %>%
pivot_longer(cols = -c(name, grp), names_to = "fruit",
values_to = "Value")) %>%
pivot_wider(names_from = grp, values_from = Value)
Или эффективный подход, аналогичный bind_rows
ранее (но здесь это невозможно сделать из-за разных типов столбцов)
map_dfr(all_data, ~
.x %>%
mutate_at(-1, as.character), .id = 'grp') %>%
pivot_longer(cols = c(-name, -grp), names_to = "fruit",
values_to = "Value", values_drop_na = TRUE) %>%
pivot_wider(names_from = grp, values_from = Value)