重塑没有idvar的数据框-R
Reshape data frame with no idvar - R
假设我有这个数据框:
name <- rep(LETTERS[seq(from=1, to =2)], each=3)
MeasA <- c(1:6)
MeasB <- c(7:12)
df <- data.frame(name, MeasA, MeasB)
而且我想重塑成没有像这样的 idvar 的格式:
MeasA_A MeasB_A MeasB_B MeasB_B
1 7 4 10
2 8 5 11
3 9 6 12
我一直在阅读有关重塑和熔化的内容:
Reshaping data frame with duplicates
http://seananderson.ca/2013/10/19/reshape.html
但是对于这些函数,我需要指定一个 idvar。我试过了:
tt <- reshape(df, timevar = "name", direction="wide")
和
tt <- dcast(df, ~name)
但它们显然不起作用。也许我需要使用 split (Split data.frame based on levels of a factor into new data.frames) 然后重塑?
我们可以通过 'name' 列 split
data.frame
到 list
,cbind
list
元素。我们可以使用 sub
或 paste
.
更改列名
res <- do.call(cbind,split(df[-1], df$name))
colnames(res) <- sub('([^.]+)\.([^.]+)', '\2_\1', colnames(res))
res
# MeasA_A MeasB_A MeasA_B MeasB_B
#1 1 7 4 10
#2 2 8 5 11
#3 3 9 6 12
如果我们想使用 dcast
,我们可能需要创建按 'name' 分组的序列列。在这里,我使用 'data.table' 的开发版本中的 dcast
,即 v1.9.5
,因为它可以包含多个 value.var
列。安装开发版本的说明是 here
。我们将 'data.frame' 转换为 'data.table' (setDT(df)
),创建序列列 ('i1'),按 'name' 分组,使用 dcast
并指定value.var
列。
library(data.table)#v1.9.5+
setDT(df)[, i1:= 1:.N, by = name]
dcast(df, i1~name, value.var=c('MeasA', 'MeasB'))[, i1:= NULL][]
# MeasA_A MeasA_B MeasB_A MeasB_B
#1: 1 4 7 10
#2: 2 5 8 11
#3: 3 6 9 12
以类似的方式,我们可以使用 base R
中的 reshape
。我们使用 ave
创建序列列并将其用作 'idvarin
reshape`。
df1 <- transform(df, i1= ave(seq_along(name), name, FUN=seq_along))
reshape(df1, idvar='i1', timevar='name', direction='wide')[-1]
# MeasA.A MeasB.A MeasA.B MeasB.B
#1 1 7 4 10
#2 2 8 5 11
#3 3 9 6 12
假设我有这个数据框:
name <- rep(LETTERS[seq(from=1, to =2)], each=3)
MeasA <- c(1:6)
MeasB <- c(7:12)
df <- data.frame(name, MeasA, MeasB)
而且我想重塑成没有像这样的 idvar 的格式:
MeasA_A MeasB_A MeasB_B MeasB_B
1 7 4 10
2 8 5 11
3 9 6 12
我一直在阅读有关重塑和熔化的内容:
Reshaping data frame with duplicates
http://seananderson.ca/2013/10/19/reshape.html
但是对于这些函数,我需要指定一个 idvar。我试过了:
tt <- reshape(df, timevar = "name", direction="wide")
和
tt <- dcast(df, ~name)
但它们显然不起作用。也许我需要使用 split (Split data.frame based on levels of a factor into new data.frames) 然后重塑?
我们可以通过 'name' 列 split
data.frame
到 list
,cbind
list
元素。我们可以使用 sub
或 paste
.
res <- do.call(cbind,split(df[-1], df$name))
colnames(res) <- sub('([^.]+)\.([^.]+)', '\2_\1', colnames(res))
res
# MeasA_A MeasB_A MeasA_B MeasB_B
#1 1 7 4 10
#2 2 8 5 11
#3 3 9 6 12
如果我们想使用 dcast
,我们可能需要创建按 'name' 分组的序列列。在这里,我使用 'data.table' 的开发版本中的 dcast
,即 v1.9.5
,因为它可以包含多个 value.var
列。安装开发版本的说明是 here
。我们将 'data.frame' 转换为 'data.table' (setDT(df)
),创建序列列 ('i1'),按 'name' 分组,使用 dcast
并指定value.var
列。
library(data.table)#v1.9.5+
setDT(df)[, i1:= 1:.N, by = name]
dcast(df, i1~name, value.var=c('MeasA', 'MeasB'))[, i1:= NULL][]
# MeasA_A MeasA_B MeasB_A MeasB_B
#1: 1 4 7 10
#2: 2 5 8 11
#3: 3 6 9 12
以类似的方式,我们可以使用 base R
中的 reshape
。我们使用 ave
创建序列列并将其用作 'idvarin
reshape`。
df1 <- transform(df, i1= ave(seq_along(name), name, FUN=seq_along))
reshape(df1, idvar='i1', timevar='name', direction='wide')[-1]
# MeasA.A MeasB.A MeasA.B MeasB.B
#1 1 7 4 10
#2 2 8 5 11
#3 3 9 6 12