融化并铸造一个笨拙的数据框
Melt and dcast an awkward dataframe
我正在使用如下所示的数据框。我想看起来像:
省份:选区:甲党票数:甲党百分比:乙党票数:乙党百分比:丙党票数:丙党百分比
目前,候选人姓名作为唯一标识符运行良好,避免了对聚合功能的需要,但我最终会放弃它。
candidate<-c('bob jones', 'bobby jones', 'sara jones', 'sara norah', 'nora jones', 'other name', 'name other', 'thomas name', 'name judge', 'my mayor', 'peter peter', 'paul paul')
party<-rep(c('A', 'B', 'C'), 4)
district<-c(rep('District 1', 3), rep('District 2', 3), rep('District 3', 3), rep('Disctrict 4', 3))
province<-c(rep('Province 1', 3), rep('Province 2', 3), rep('Province 3', 3), rep('Province 4', 3))
votes<-round(rnorm(12, mean=5000, sd=1000),0)
percent<-round(rnorm(12, mean=37, sd=10),2)
df<-data.frame(party, district,province, votes, percent, candidate)
我正在使用这些命令
df.test<-melt(df, id.vars=c('candidate', 'province', 'district', 'party'))
dcast(df.test, candidate+province+district~variable+party, value.var=c('value'))
很接近,不是每个区创建一行,而是每个区创建四行。问题是:在我的样本数据集中,当我从我的转换调用中删除 'candidate' 时,这个样本数据集工作得很好,例如
dcast(df.test, district~variable+party, value.var=c('value'))
但是当我在我的数据集中使用相同的调用时,我不再拥有唯一标识符,并且这会在长度上聚合。
希望对您有所帮助。谢谢。
在 data.table v1.9.5
中,dcast
可以在多个 value.var
列上进行转换。有了它你可以做:
require(data.table) #v1.9.5+
ans = dcast(setDT(df), province + district ~ party, value.var = c("votes", "percent"))
# province district votes_A votes_B votes_C percent_A percent_B percent_C
# 1: Province 1 District 1 3072 3149 4262 34.29 18.45 19.20
# 2: Province 2 District 2 5918 3970 4201 36.56 46.22 43.16
# 3: Province 3 District 3 5593 5208 5260 26.58 31.20 39.00
# 4: Province 4 Disctrict 4 6138 4537 6293 43.97 43.62 32.48
如果您想要 data.frame
回来,那么您可以 setDF(ans)
将 ans
转换为 data.frame
。
您可以按照these instructions安装v1.9.5
。
这是一个基本解决方案:
set.seed(1)
candidate<-c('bob jones', 'bobby jones', 'sara jones', 'sara norah', 'nora jones', 'other name', 'name other', 'thomas name', 'name judge', 'my mayor', 'peter peter', 'paul paul')
party<-rep(c('A', 'B', 'C'), 4)
district<-c(rep('District 1', 3), rep('District 2', 3), rep('District 3', 3), rep('Disctrict 4', 3))
province<-c(rep('Province 1', 3), rep('Province 2', 3), rep('Province 3', 3), rep('Province 4', 3))
votes<-round(rnorm(12, mean=5000, sd=1000),0)
percent<-round(rnorm(12, mean=37, sd=10),2)
df<-data.frame(party, district,province, votes, percent, candidate)
reshape(df, direction = 'wide', times = c('votes','percent'),
idvar = c('province', 'district'),
timevar = 'party', drop = 'candidate')
# district province votes.A percent.A votes.B percent.B votes.C percent.C
# 1 District 1 Province 1 4374 30.79 5184 14.85 4164 48.25
# 4 District 2 Province 2 6595 36.55 5330 36.84 4180 46.44
# 7 District 3 Province 3 5487 45.21 5738 42.94 5576 46.19
# 10 Disctrict 4 Province 4 4695 44.82 6512 37.75 5390 17.11
我正在使用如下所示的数据框。我想看起来像:
省份:选区:甲党票数:甲党百分比:乙党票数:乙党百分比:丙党票数:丙党百分比
目前,候选人姓名作为唯一标识符运行良好,避免了对聚合功能的需要,但我最终会放弃它。
candidate<-c('bob jones', 'bobby jones', 'sara jones', 'sara norah', 'nora jones', 'other name', 'name other', 'thomas name', 'name judge', 'my mayor', 'peter peter', 'paul paul')
party<-rep(c('A', 'B', 'C'), 4)
district<-c(rep('District 1', 3), rep('District 2', 3), rep('District 3', 3), rep('Disctrict 4', 3))
province<-c(rep('Province 1', 3), rep('Province 2', 3), rep('Province 3', 3), rep('Province 4', 3))
votes<-round(rnorm(12, mean=5000, sd=1000),0)
percent<-round(rnorm(12, mean=37, sd=10),2)
df<-data.frame(party, district,province, votes, percent, candidate)
我正在使用这些命令
df.test<-melt(df, id.vars=c('candidate', 'province', 'district', 'party'))
dcast(df.test, candidate+province+district~variable+party, value.var=c('value'))
很接近,不是每个区创建一行,而是每个区创建四行。问题是:在我的样本数据集中,当我从我的转换调用中删除 'candidate' 时,这个样本数据集工作得很好,例如
dcast(df.test, district~variable+party, value.var=c('value'))
但是当我在我的数据集中使用相同的调用时,我不再拥有唯一标识符,并且这会在长度上聚合。
希望对您有所帮助。谢谢。
在 data.table v1.9.5
中,dcast
可以在多个 value.var
列上进行转换。有了它你可以做:
require(data.table) #v1.9.5+
ans = dcast(setDT(df), province + district ~ party, value.var = c("votes", "percent"))
# province district votes_A votes_B votes_C percent_A percent_B percent_C
# 1: Province 1 District 1 3072 3149 4262 34.29 18.45 19.20
# 2: Province 2 District 2 5918 3970 4201 36.56 46.22 43.16
# 3: Province 3 District 3 5593 5208 5260 26.58 31.20 39.00
# 4: Province 4 Disctrict 4 6138 4537 6293 43.97 43.62 32.48
如果您想要 data.frame
回来,那么您可以 setDF(ans)
将 ans
转换为 data.frame
。
您可以按照these instructions安装v1.9.5
。
这是一个基本解决方案:
set.seed(1)
candidate<-c('bob jones', 'bobby jones', 'sara jones', 'sara norah', 'nora jones', 'other name', 'name other', 'thomas name', 'name judge', 'my mayor', 'peter peter', 'paul paul')
party<-rep(c('A', 'B', 'C'), 4)
district<-c(rep('District 1', 3), rep('District 2', 3), rep('District 3', 3), rep('Disctrict 4', 3))
province<-c(rep('Province 1', 3), rep('Province 2', 3), rep('Province 3', 3), rep('Province 4', 3))
votes<-round(rnorm(12, mean=5000, sd=1000),0)
percent<-round(rnorm(12, mean=37, sd=10),2)
df<-data.frame(party, district,province, votes, percent, candidate)
reshape(df, direction = 'wide', times = c('votes','percent'),
idvar = c('province', 'district'),
timevar = 'party', drop = 'candidate')
# district province votes.A percent.A votes.B percent.B votes.C percent.C
# 1 District 1 Province 1 4374 30.79 5184 14.85 4164 48.25
# 4 District 2 Province 2 6595 36.55 5330 36.84 4180 46.44
# 7 District 3 Province 3 5487 45.21 5738 42.94 5576 46.19
# 10 Disctrict 4 Province 4 4695 44.82 6512 37.75 5390 17.11