繁体   English   中英

不使用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

我一直在阅读有关重塑和融化的内容:

用重复项重塑数据框

http://seananderson.ca/2013/10/19/reshape.html

但是使用这些功能,我需要指定一个idvar。 我试过了:

tt <- reshape(df, timevar = "name", direction="wide")

tt <- dcast(df, ~name)

但是它们显然不起作用。 也许我需要使用split( 将因子水平将data.frame拆分为新的data.frames )然后进行整形

我们可以通过“名称”列将data.frame splitlist ,并cbind list元素。 我们可以使用subpaste更改列名称。

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 ,则可能需要创建按“名称”分组的序列列。 在这里,我使用dcast从“data.table”即的开发人员版本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 Rbase Rreshape 我们使用ave创建序列列,并将其用作“ reshape in idvar”。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM