将数据框重新排列到表格中,与“融化”相反 [重复]

Posted

技术标签:

【中文标题】将数据框重新排列到表格中,与“融化”相反 [重复]【英文标题】:Rearrange dataframe to a table, the opposite of "melt" [duplicate] 【发布时间】:2011-12-11 06:51:04 【问题描述】:

我有这样的巨大数据框:

SN = c(1:100, 1:100, 1:100, 1:100)  
class = c(rep("A1", 100), rep("B2", 100), rep("C3", 100), rep("D4", 100)) # total 6000 levels 
myvar = rnorm(400)
mydf = data.frame(SN, class, myvar) 

我想“解开”到一个表,每个级别都为单列,myvar 被填充:

SN          A1            B2          C3         D4       .............and so on for all 6000 

我怎样才能做到这一点,我知道这是一个简单的问题,但我想不通。

【问题讨论】:

在包中reshape2melt相反的是cast 感谢您的建议,require(reshape2); acast(mydf, myvar ~ class) 产生了糟糕的结果 请参阅下面的答案以获取正确的语法。用了几次之后真的很自然。比内置的reshape()好多了。 把你想要的表格输出想象成一个图:我们希望SN在垂直方向上变化(如y),class在水平方向上变化(如x) .所以我们有SN ~ class而不是y ~ x 请参阅***.com/a/9617424/210673 了解类似问题以及执行此操作的方法列表。 【参考方案1】:
> dcast(mydf, SN ~ class)

  SN         A1         B2          C3          D4
1  1  0.1461258  0.8325014  0.33562088 -0.07294576
2  2  0.5964182  0.4593710 -0.23652803 -1.52539568
3  3  2.0247742 -1.1235963  1.79875447 -1.87462227
4  4  0.8184004  1.3486721  0.76076486 -1.18311991
5  5 -0.6577212  0.3666741 -0.06057506  1.38825487
6  6  0.1590443  0.2043661  0.08161778  0.10421797
...

【讨论】:

注意:这是来自reshape2 库。 另请注意,“最佳实践”是:dcast(mydf, SN ~ class, value.var="myvar") 嗯,这样可以吗? iris_melt <- melt(iris); dcast(iris_melt, Species~variable)?因为它没有。它给出计数(按测量表的物种)。 @naught101:当给定组合有不止一行时,就会发生这种情况。如果只有一个,则使用该值。【参考方案2】:
molten = melt( mydf , id.vars = c( "SN" , "class" ) , measure.vars = "myvar" )
casted = dcast( molten , SN~class )

【讨论】:

【参考方案3】:

split 的另一种方法:

mydfSplit <- split(mydf[,-2], mydf$class, drop=TRUE)

结果是一个列表,如果组件具有相同的尺寸(在本例中是这样),则可以轻松地将其转换为 data.frame

mydf2 <- do.call(cbind, mydfSplit)

这个解决方案的问题是最终结果的名称需要清理。但是,对于更一般的数据,如果 SN 对于每个类都不同,这可能会很有用。

【讨论】:

【参考方案4】:

在基础 R 中,你可以这样做......

# get it sorted so that all you need to do is make a matrix out of it
mydf <- mydf[order(mydf$class, mydf$SN),]
# save the unique values of SN
SNu <- unique(mydf$SN)
# combine a matrix with SN
mydfw <- data.frame(SNu, matrix(mydf$myvar, nrow = length(SNu)))
# name your columns    
colnames(mydfw) <- c('SN', levels(mydf$class))

或者,为了更简洁的表达式使用聚合

aggregate(myvar~SN, mydf, 'c')
# column names don't come out great
colnames(mydfw) <- c('SN', levels(mydf$class))

【讨论】:

假设所有级别的组合都存在,这通常是一个危险的假设。 它适用于示例。你只是不喜欢第一个,因为它非常快。 :) 但是开个玩笑,提问者,哈德利是正确的,如果你没有完整的矩阵,那么这将无法正常工作。您可以使用 expand.grid 与完整的因子设计合并以获取感兴趣的因素。

以上是关于将数据框重新排列到表格中,与“融化”相反 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何旋转/取消旋转(投射/融化)数据框? [复制]

如何融化熊猫数据框?

如何融化熊猫数据框?

Python Pandas——在多列上融化、旋转、转置

如何将 DataFrame 的选定列移动到它的末尾(重新排列列位置)? [复制]

熊猫数据框重新排列堆栈到两个值列(用于因子图)