如何将数据从长格式转换为宽格式

我无法重新排列以下数据框:


set.seed(45)

dat1 <- data.frame(

    name = rep(c("firstName", "secondName"), each=4),

    numbers = rep(1:4, 2),

    value = rnorm(8)

    )


dat1

       name  numbers      value

1  firstName       1  0.3407997

2  firstName       2 -0.7033403

3  firstName       3 -0.3795377

4  firstName       4 -0.7460474

5 secondName       1 -0.8981073

6 secondName       2 -0.3347941

7 secondName       3 -0.5013782

8 secondName       4 -0.1745357

我想重新整形它,以便每个唯一的“名称”变量是一个rowname,其中“值”作为沿该行的观察值,“数字”作为同名。有点像:


     name          1          2          3         4

1  firstName  0.3407997 -0.7033403 -0.3795377 -0.7460474

5 secondName -0.8981073 -0.3347941 -0.5013782 -0.1745357

我看melt,并cast和其他一些东西,但没有人可以做的工作。


慕婉清6462132
浏览 1184回答 6
6回答

汪汪一只猫

使用reshape功能:reshape(dat1,&nbsp;idvar&nbsp;=&nbsp;"name",&nbsp;timevar&nbsp;=&nbsp;"numbers",&nbsp;direction&nbsp;=&nbsp;"wide")

慕莱坞森

新的(2014年)tidyr包也做到这一点简单地说,与gather()/&nbsp;spread()是的条款melt/&nbsp;cast。library(tidyr)spread(dat1,&nbsp;key&nbsp;=&nbsp;numbers,&nbsp;value&nbsp;=&nbsp;value)来自github,tidyr是一个重新reshape2设计,旨在配合整洁的数据框架,并与数据分析建立一个坚实的管道,magrittr并dplyr建立一个坚实的管道。就像reshape2重塑tidyr不到一样,做得不到reshape2。它专门用于整理数据,而不是一般的重塑reshape2,或重塑的一般聚合。特别是,内置方法仅适用于数据帧,并且不tidyr提供边距或聚合。

侃侃尔雅

您可以使用该reshape()函数或reshape包中的melt()/ cast()functions 执行此操作。对于第二个选项,示例代码是library(reshape)cast(dat1, name ~ numbers)或使用 reshape2library(reshape2)dcast(dat1, name ~ numbers)

墨色风雨

如果性能是一个问题的另一个选择是使用'的融合和dcast函数data.table的扩展reshape2(参考:使用data.tables进行高效重塑)library(data.table)setDT(dat1)dcast(dat1, name ~ numbers, value.var = "value")#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;4# 1:&nbsp; firstName&nbsp; 0.1836433 -0.8356286 1.5952808 0.3295078# 2: secondName -0.8204684&nbsp; 0.4874291 0.7383247 0.5757814而且,从data.table v1.9.6开始,我们可以在多列上进行转换## add an extra columndat1[, value2 := value * 2]## cast multiple value columnsdcast(dat1, name ~ numbers, value.var = c("value", "value2"))#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name&nbsp; &nbsp; value_1&nbsp; &nbsp; value_2&nbsp; &nbsp;value_3&nbsp; &nbsp;value_4&nbsp; &nbsp;value2_1&nbsp; &nbsp;value2_2 value2_3&nbsp; value2_4# 1:&nbsp; firstName&nbsp; 0.1836433 -0.8356286 1.5952808 0.3295078&nbsp; 0.3672866 -1.6712572 3.190562 0.6590155# 2: secondName -0.8204684&nbsp; 0.4874291 0.7383247 0.5757814 -1.6409368&nbsp; 0.9748581 1.476649 1.1515627

慕少森

使用您的示例数据框,我们可以:xtabs(value&nbsp;~&nbsp;name&nbsp;+&nbsp;numbers,&nbsp;data&nbsp;=&nbsp;dat1)

拉莫斯之舞

其他两个选择:基础包:df <- unstack(dat1, form = value ~ numbers)rownames(df) <- unique(dat1$name)dfsqldf 包:library(sqldf)sqldf('SELECT name,&nbsp; &nbsp; &nbsp; MAX(CASE WHEN numbers = 1 THEN value ELSE NULL END) x1,&nbsp;&nbsp; &nbsp; &nbsp; MAX(CASE WHEN numbers = 2 THEN value ELSE NULL END) x2,&nbsp; &nbsp; &nbsp; MAX(CASE WHEN numbers = 3 THEN value ELSE NULL END) x3,&nbsp; &nbsp; &nbsp; MAX(CASE WHEN numbers = 4 THEN value ELSE NULL END) x4&nbsp; &nbsp; &nbsp; FROM dat1&nbsp; &nbsp; &nbsp; GROUP BY name')
打开App,查看更多内容
随时随地看视频慕课网APP