如何使用 duplicates/triplicates 将长数据帧转换为宽数据帧?
How to convert a long data frame to a wide data frame with duplicates/triplicates?
假设我有一个包含三列的长格式数据框。 x
列包含测量值,y
3 个变量的名称,z
包含 2 个水平。每个 y
变量都有重复的测量值:
df <- data.frame(x=c(1:12), y=rep(0:2, 4), z=rep(letters[1:2], 6))
df$y <- as.factor(df$y)
df <- arrange(df, y, z)
df
x y z
1 1 0 a
2 7 0 a
3 4 0 b
4 10 0 b
5 5 1 a
6 11 1 a
7 2 1 b
8 8 1 b
9 3 2 a
10 9 2 a
11 6 2 b
12 12 2 b
我怎样才能得到这样的df_wide
?
z 0 1 2
a 1 5 3
a 7 11 9
b 4 2 6
b 10 8 12
do.call(cbind, lapply(split(df, df$y), function(a)
setNames(object = data.frame(a$x,
row.names = paste0(as.character(a$z), 1:NROW(a))),
nm = a$y[1])))
# 0 1 2
#a1 1 5 3
#a2 7 11 9
#b3 4 2 6
#b4 10 8 12
使用 data.table
包中的 dcast()
和 rowid()
函数,这变成了 "one-liner":
library(data.table)
dcast(setDT(df), paste0(z, rowid(y, z)) ~ y, value.var = "x")
z 0 1 2
1: a1 1 5 3
2: a2 7 11 9
3: b1 4 2 6
4: b2 10 8 12
假设我有一个包含三列的长格式数据框。 x
列包含测量值,y
3 个变量的名称,z
包含 2 个水平。每个 y
变量都有重复的测量值:
df <- data.frame(x=c(1:12), y=rep(0:2, 4), z=rep(letters[1:2], 6))
df$y <- as.factor(df$y)
df <- arrange(df, y, z)
df
x y z
1 1 0 a
2 7 0 a
3 4 0 b
4 10 0 b
5 5 1 a
6 11 1 a
7 2 1 b
8 8 1 b
9 3 2 a
10 9 2 a
11 6 2 b
12 12 2 b
我怎样才能得到这样的df_wide
?
z 0 1 2
a 1 5 3
a 7 11 9
b 4 2 6
b 10 8 12
do.call(cbind, lapply(split(df, df$y), function(a)
setNames(object = data.frame(a$x,
row.names = paste0(as.character(a$z), 1:NROW(a))),
nm = a$y[1])))
# 0 1 2
#a1 1 5 3
#a2 7 11 9
#b3 4 2 6
#b4 10 8 12
使用 data.table
包中的 dcast()
和 rowid()
函数,这变成了 "one-liner":
library(data.table)
dcast(setDT(df), paste0(z, rowid(y, z)) ~ y, value.var = "x")
z 0 1 2 1: a1 1 5 3 2: a2 7 11 9 3: b1 4 2 6 4: b2 10 8 12