R 使用data.table将多行宽数据重塑为长数据
我有如下数据R 使用data.table将多行宽数据重塑为长数据,r,data.table,R,Data.table,我有如下数据 # am qsec vs am gear carb # 1: 1 17.36000 0.5384615 1 4.384615 2.923077 # 2: 1 17.02000 1.0000000 1 4.000000 2.000000 # 3: 0 18.18316 0.3684211 0 3.210526 2.736842 # 4: 0 17.82000 0.0000000 0 3.000000 3.000000 我想
# am qsec vs am gear carb
# 1: 1 17.36000 0.5384615 1 4.384615 2.923077
# 2: 1 17.02000 1.0000000 1 4.000000 2.000000
# 3: 0 18.18316 0.3684211 0 3.210526 2.736842
# 4: 0 17.82000 0.0000000 0 3.000000 3.000000
我想生产
# variable 0 1
# 1: qsec 18.1831579 17.3600000
# 2: qsec 17.8200000 17.0200000
# 3: vs 0.3684211 0.5384615
# 4: vs 0.0000000 1.0000000
# 5: am 0.0000000 1.0000000
# <snip>
我问了一个问题,但使用Akrun在评论中给出的解决方案,返回
dcast( melt(tdat, id.var=1), variable~am, value.var='value')
#Aggregate function missing, defaulting to 'length'
# variable 0 1
#1: qsec 2 2
#2: vs 2 2
#3: am 2 2
#4: gear 2 2
#5: carb 2 2
可以使用
数据解决此问题。表的rowid()
函数:
library(data.table)
m <- melt(tdat, id.vars="am")
dcast(m, variable + rowid(am) ~ am)[, am := NULL][]
资料
可以使用数据解决此问题。表的rowid()
函数:
library(data.table)
m <- melt(tdat, id.vars="am")
dcast(m, variable + rowid(am) ~ am)[, am := NULL][]
资料
variable 0 1
1: qsec 18.1831600 17.3600000
2: qsec 17.8200000 17.0200000
3: vs 0.3684211 0.5384615
4: vs 0.0000000 1.0000000
5: am 0.0000000 1.0000000
6: am 0.0000000 1.0000000
7: gear 3.2105260 4.3846150
8: gear 3.0000000 4.0000000
9: carb 2.7368420 2.9230770
10: carb 3.0000000 2.0000000
library(data.table)
tdat <- fread(
"# i am qsec vs am gear carb
# 1: 1 17.36000 0.5384615 1 4.384615 2.923077
# 2: 1 17.02000 1.0000000 1 4.000000 2.000000
# 3: 0 18.18316 0.3684211 0 3.210526 2.736842
# 4: 0 17.82000 0.0000000 0 3.000000 3.000000",
drop = 1:2, colClasses = list(integer = c(3, 6))
)
setDT(mtcars[7:11])[, lapply(.SD, function(y) c(mean(y), median(y))), by = am]
am qsec vs gear carb
1: 1 17.36000 0.5384615 4.384615 2.923077
2: 1 17.02000 1.0000000 4.000000 2.000000
3: 0 18.18316 0.3684211 3.210526 2.736842
4: 0 17.82000 0.0000000 3.000000 3.000000