2011-10-19 35 views
45

我有巨大的数据帧是这样的:重新排列数据帧到一个表中,相反“熔体”

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 

我怎么能做到这一点,我知道这是一个简单的问题,但我无法弄清楚。

+2

在包''reshape2'''熔化'的相反是'铸' – Andrie

+0

感谢您的建议,要求(重塑2); acast(mydf,myvar〜class)产生了合适的结果 – jon

+0

请参阅下面的答案以获取正确的语法。在你使用它几次后真的很自然。比内置的'reshape()'好得多。 –

回答

47
> 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 
... 
+10

注意:这是来自'reshape2'库。 –

+2

另请注意,“最佳做法”是:dcast(mydf,SN〜class,value.var =“myvar”) – pallevillesen

+0

呃,应该这样工作吗? iris_melt < - 熔化(虹膜); dcast(iris_melt,Species〜variable)'?因为它不。它提供计数(通过测量表进行分类)。 – naught101

5
molten = melt(mydf , id.vars = c("SN" , "class") , measure.vars = "myvar") 
casted = dcast(molten , SN~class) 
1

在基础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)) 

或者,更简洁的表达使用聚合

aggregate(myvar~SN, mydf, 'c') 
# column names don't come out great 
colnames(mydfw) <- c('SN', levels(mydf$class)) 
+1

假定所有级别的组合都存在,这通常是一个危险的假设。 – hadley

+0

它适用于此示例。你只是不喜欢第一个,因为它非常快。 :)但开个玩笑,提问者,哈德利是正确的,如果你没有一个完整的矩阵,那么这将无法正常工作。对于感兴趣的因素,您可以使用expand.grid合并完整的因子设计。 – John

1

另一种方法与split

mydfSplit <- split(mydf[,-2], mydf$class, drop=TRUE) 

结果是可以很容易地转换为data.frame如果组件具有一个列表中的相同的尺寸(这是真实的在这个例子中):

mydf2 <- do.call(cbind, mydfSplit) 

这种解决方案的问题是在这些名称最终结果需要清洗。但是,对于更一般的数据,如果SN对于每个类都不相同,则这可能很有用。