将行批量转置为 R 中的列
Transpose Rows in batches to Columns in R
我的 data.frame df
看起来像这样:
A 1
A 2
A 5
B 2
B 3
B 4
C 3
C 7
C 9
我希望它看起来像这样:
A B C
1 2 3
2 3 7
5 4 9
我试过 spread()
但可能方法不对。有什么想法吗?
我们可以使用 unstack
从 base R
unstack(df1, col2 ~ col1)
# A B C
#1 1 2 3
#2 2 3 7
#3 5 4 9
或 split
data.frame(split(df1$col2, df1$col1))
或者如果我们使用 spread
或 pivot_wider
,确保创建一个序列列
library(dplyr)
library(tidyr)
df1 %>%
group_by(col1) %>%
mutate(rn = row_number()) %>%
ungroup %>%
pivot_wider(names_from = col1, values_from = col2) %>%
# or use
# spread(col1, col2) %>%
select(-rn)
# A tibble: 3 x 3
# A B C
# <int> <int> <int>
#1 1 2 3
#2 2 3 7
#3 5 4 9
或使用dcast
library(data.table)
dcast(setDT(df1), rowid(col1) ~ col1)[, .(A, B, C)]
数据
df1 <- structure(list(col1 = c("A", "A", "A", "B", "B", "B", "C", "C",
"C"), col2 = c(1L, 2L, 5L, 2L, 3L, 4L, 3L, 7L, 9L)),
class = "data.frame", row.names = c(NA,
-9L))
在data.table
中,我们可以使用dcast
:
library(data.table)
dcast(setDT(df), rowid(col1)~col1, value.var = 'col2')[, col1 := NULL][]
# A B C
#1: 1 2 3
#2: 2 3 7
#3: 5 4 9
我的 data.frame df
看起来像这样:
A 1
A 2
A 5
B 2
B 3
B 4
C 3
C 7
C 9
我希望它看起来像这样:
A B C
1 2 3
2 3 7
5 4 9
我试过 spread()
但可能方法不对。有什么想法吗?
我们可以使用 unstack
从 base R
unstack(df1, col2 ~ col1)
# A B C
#1 1 2 3
#2 2 3 7
#3 5 4 9
或 split
data.frame(split(df1$col2, df1$col1))
或者如果我们使用 spread
或 pivot_wider
,确保创建一个序列列
library(dplyr)
library(tidyr)
df1 %>%
group_by(col1) %>%
mutate(rn = row_number()) %>%
ungroup %>%
pivot_wider(names_from = col1, values_from = col2) %>%
# or use
# spread(col1, col2) %>%
select(-rn)
# A tibble: 3 x 3
# A B C
# <int> <int> <int>
#1 1 2 3
#2 2 3 7
#3 5 4 9
或使用dcast
library(data.table)
dcast(setDT(df1), rowid(col1) ~ col1)[, .(A, B, C)]
数据
df1 <- structure(list(col1 = c("A", "A", "A", "B", "B", "B", "C", "C",
"C"), col2 = c(1L, 2L, 5L, 2L, 3L, 4L, 3L, 7L, 9L)),
class = "data.frame", row.names = c(NA,
-9L))
在data.table
中,我们可以使用dcast
:
library(data.table)
dcast(setDT(df), rowid(col1)~col1, value.var = 'col2')[, col1 := NULL][]
# A B C
#1: 1 2 3
#2: 2 3 7
#3: 5 4 9