重新排列数据框到一个表,相反的“融化”
我有这样的巨大数据框:
SN = c(1:100, 1:100, 1:100, 1:100) class = c(rep("A1", 100), rep("B2", 100), rep("C3", 100), rep("D4", 100)) # total 6000 levels myvar = rnorm(400) mydf = data.frame(SN, class, myvar)
我想“解开”一个表,每个级别的单列和myvar填充:
SN A1 B2 C3 D4 .............and so on for all 6000
我怎么能做到这一点,我知道这是一个简单的问题,但我无法弄清楚。
> dcast(mydf, SN ~ class) SN A1 B2 C3 D4 1 1 0.1461258 0.8325014 0.33562088 -0.07294576 2 2 0.5964182 0.4593710 -0.23652803 -1.52539568 3 3 2.0247742 -1.1235963 1.79875447 -1.87462227 4 4 0.8184004 1.3486721 0.76076486 -1.18311991 5 5 -0.6577212 0.3666741 -0.06057506 1.38825487 6 6 0.1590443 0.2043661 0.08161778 0.10421797 ...
molten = melt( mydf , id.vars = c( "SN" , "class" ) , measure.vars = "myvar" ) casted = dcast( molten , SN~class )
在基地R你可以这样做…
# get it sorted so that all you need to do is make a matrix out of it mydf <- mydf[order(mydf$class, mydf$SN),] # save the unique values of SN SNu <- unique(mydf$SN) # combine a matrix with SN mydfw <- data.frame(SNu, matrix(mydf$myvar, nrow = length(SNu))) # name your columns colnames(mydfw) <- c('SN', levels(mydf$class))
或者,使用聚合更简洁的expression式
aggregate(myvar~SN, mydf, 'c') # column names don't come out great colnames(mydfw) <- c('SN', levels(mydf$class))
另一种split
方法:
mydfSplit <- split(mydf[,-2], mydf$class, drop=TRUE)
结果是一个列表,如果组件具有相同的尺寸(在这个例子中是这样的),那么它可以很容易地转换成data.frame
:
mydf2 <- do.call(cbind, mydfSplit)
这个解决scheme的问题是最终结果的名字需要清理。 但是,对于更一般的数据,如果SN
对于每个类都是不同的,则这可能是有用的。