6 回答
TA贡献1898条经验 获得超8个赞
使用reshape
功能:
reshape(dat1, idvar = "name", timevar = "numbers", direction = "wide")
TA贡献1810条经验 获得超4个赞
新的(2014年)tidyr
包也做到这一点简单地说,与gather()
/ spread()
是的条款melt
/ cast
。
library(tidyr)spread(dat1, key = numbers, value = value)
来自github,
tidyr
是一个重新reshape2
设计,旨在配合整洁的数据框架,并与数据分析建立一个坚实的管道,magrittr
并dplyr
建立一个坚实的管道。就像
reshape2
重塑tidyr
不到一样,做得不到reshape2
。它专门用于整理数据,而不是一般的重塑reshape2
,或重塑的一般聚合。特别是,内置方法仅适用于数据帧,并且不tidyr
提供边距或聚合。
TA贡献1801条经验 获得超16个赞
您可以使用该reshape()函数或reshape包中的melt()/ cast()functions 执行此操作。对于第二个选项,示例代码是
library(reshape)
cast(dat1, name ~ numbers)
或使用 reshape2
library(reshape2)
dcast(dat1, name ~ numbers)
TA贡献1853条经验 获得超6个赞
如果性能是一个问题的另一个选择是使用'的融合和dcast函数data.table
的扩展reshape2
library(data.table)
setDT(dat1)
dcast(dat1, name ~ numbers, value.var = "value")
# name 1 2 3 4
# 1: firstName 0.1836433 -0.8356286 1.5952808 0.3295078
# 2: secondName -0.8204684 0.4874291 0.7383247 0.5757814
而且,从data.table v1.9.6开始,我们可以在多列上进行转换
## add an extra column
dat1[, value2 := value * 2]
## cast multiple value columns
dcast(dat1, name ~ numbers, value.var = c("value", "value2"))
# name value_1 value_2 value_3 value_4 value2_1 value2_2 value2_3 value2_4
# 1: firstName 0.1836433 -0.8356286 1.5952808 0.3295078 0.3672866 -1.6712572 3.190562 0.6590155
# 2: secondName -0.8204684 0.4874291 0.7383247 0.5757814 -1.6409368 0.9748581 1.476649 1.1515627
TA贡献1820条经验 获得超10个赞
其他两个选择:
基础包:
df <- unstack(dat1, form = value ~ numbers)
rownames(df) <- unique(dat1$name)
df
sqldf 包:
library(sqldf)
sqldf('SELECT name,
MAX(CASE WHEN numbers = 1 THEN value ELSE NULL END) x1,
MAX(CASE WHEN numbers = 2 THEN value ELSE NULL END) x2,
MAX(CASE WHEN numbers = 3 THEN value ELSE NULL END) x3,
MAX(CASE WHEN numbers = 4 THEN value ELSE NULL END) x4
FROM dat1
GROUP BY name')
- 6 回答
- 0 关注
- 1183 浏览
添加回答
举报