Объединить несколько df в списке в разные столбцы одного df

У меня есть список фреймов данных (df1) в R, состоящий из 40 фреймов данных, каждый из которых имеет только 1 столбец (V1). Я хочу объединить все кадры данных в df1 в один фрейм данных (df2), где каждый фрейм данных в df1 стал просто столбцом в df2.

Пока делаю так:

df2 <- bind_rows(df1, .id = "column_label")

head(df2)   
column_label         V1
Hazt              miR-92
Hazt              miR-92
Hazt              miR-92
Hazt              miR-184
Hazt              miR-184
PPee              miR-92
PPee              miR-3

Однако, как было сказано ранее, я бы хотел, чтобы новый фрейм данных выглядел так:

Hazt       PPee 
miR-92     miR-92
miR-92     miR-3
miR-92
miR-184
miR-184

С таким количеством столбцов, как исходные кадры данных, где в df1.

Ваш ожидаемый результат для второго столбца имеет NA или пустой?

akrun 14.12.2020 22:23

пустой предпочтительно

Amaranta_Remedios 14.12.2020 22:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
68
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Мы можем использовать pivot_wider

library(dplyr)
library(tidyr)
library(data.table)
df2 %>% 
    mutate(rn = rowid(column_label)) %>%
    pivot_wider(names_from = column_label, values_from = V1, values_fill = "") %>%
    select(-rn)

-выход

# A tibble: 5 x 2
#  Hazt    PPee    
#  <chr>   <chr>   
#1 miR-92  "miR-92"
#2 miR-92  "miR-3" 
#3 miR-92  ""      
#4 miR-184 ""      
#5 miR-184 ""      

данные

df2 <- structure(list(column_label = c("Hazt", "Hazt", "Hazt", "Hazt", 
"Hazt", "PPee", "PPee"), V1 = c("miR-92", "miR-92", "miR-92", 
"miR-184", "miR-184", "miR-92", "miR-3")), class = "data.frame",
row.names = c(NA, 
-7L))

Если df1 — это list, попробуйте следующее:

df2 <- do.call("cbind",df1)

Если у вас есть фреймы данных с разным количеством строк, попробуйте следующее:

df1 <- lapply(df1, function(x,n){if (nrow(x)<n){x[n,]<-NA};return(x)},n = max(sapply(df1,nrow)))

do.call("cbind",df1)

Спасибо, что предложили что-то еще. Я попробовал и получил эту ошибку Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 107, 42, 175, 37, 53, 57, 68, 47, 44, 36, 41, 65, 35, 56, 55, 6, 106, 27, 76, 60, 51, 43, 64, 16, 14, 29, 105, 109, 20, 23, 18

Amaranta_Remedios 14.12.2020 22:56

Базовый вариант R с использованием list2DF + unstack

> list2DF(lapply(u <- unstack(rev(df2)), `length<-`, max(lengths(u))))
     Hazt   PPee
1  miR-92 miR-92
2  miR-92  miR-3
3  miR-92   <NA>
4 miR-184   <NA>
5 miR-184   <NA>

В базе R вы можете разделить данные на основе столбца column_label, а затем создать фрейм данных, добавив к нему NAs.

tmp <- split(df2$V1, df2$column_label)
sapply(tmp, `[`, 1:max(lengths(tmp)))

#         Hazt      PPee    
#[1,] "miR-92"  "miR-92"
#[2,] "miR-92"  "miR-3" 
#[3,] "miR-92"  NA      
#[4,] "miR-184" NA      
#[5,] "miR-184" NA      

Другие вопросы по теме