Reshaping data frame with duplicates

耗尽温柔 提交于 2019-11-27 09:07:25

If you want to reshape and you have duplicates, you're going to need to give each pair a unique id:

foorle <- rle(foo$grade)
fooids <- rep(seq_len(length(foorle$values)), times=foorle$lengths)

fooids
 [1]  1  1  2  2  3  3  4  4  5  5  6  6  7  7  8  8  9  9 10 10

Now you'll be able to use reshape properly:

idfoo <- cbind(id=fooids, foo)

library(reshape)
dcast(idfoo, id+grade~var.type, value.var="var.val")

   id grade SE  SS
1   1     3 47 120
2   2     4 46 120
3   3     5 46 120
4   4     6 47 120
5   5     7 46 120
6   6     8 46 120
7   7     3 12 120
8   8     4 14 120
9   9     5 16 120
10 10     6 20 120

EDIT: Please note I'm assuming your data is in order, else you'll have problems distinguishing between duplicates. If it isn't, you can always use order so that it is.

library(plyr)
library(reshape2)
# First we add a grouping variable to deal with the duplicates
foo <- ddply(foo, .(grade, var.type), function(x) { x$group <- 1:nrow(x); x })
dcast(foo, grade + group ~ var.type, value.var= "var.val")[-2]

 grade SE  SS
1      3 47 120
2      3 12 120
3      4 46 120
4      4 14 120
5      5 46 120
6      5 16 120
7      6 47 120
8      6 20 120
9      7 46 120
10     8 46 120

It is not as pretty as reshape, but

data.frame(grade = foo[2 * (1:(nrow(foo)/2)),]$grade, 
           SS =  foo[foo$var.type == "SS", ]$var.val, 
           SE =  foo[foo$var.type == "SE", ]$var.val ) 

produces

   grade  SS SE
1      3 120 47
2      4 120 46
3      5 120 46
4      6 120 47
5      7 120 46
6      8 120 46
7      3 120 12
8      4 120 14
9      5 120 16
10     6 120 20

You have to assume the data comes in pairs of rows for this.

If you don't have any duplicates, this will work nicely:

ss <- subset(foo, var.type=='SS')
se <- subset(foo, var.type=='SE')
ss <- data.frame(grade=ss$grade,SS=ss$var.val)
se <- data.frame(grade=se$grade,SE=se$var.val)
bar <- merge(ss,se,by='grade')
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!