У меня есть список фреймов данных (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.
пустой предпочтительно
Мы можем использовать 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
Базовый вариант 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
, а затем создать фрейм данных, добавив к нему NA
s.
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
Ваш ожидаемый результат для второго столбца имеет
NA
или пустой?