63

次のような巨大なデータフレームがあります。

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 

どうすればこれを達成できますか、それは簡単な質問だと思いますが、わかりませんでした。

4

4 に答える 4

63
> 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
...
于 2011-10-19T20:55:05.093 に答える
7
molten = melt( mydf , id.vars = c( "SN" , "class" ) , measure.vars = "myvar" )
casted = dcast( molten , SN~class )
于 2011-10-19T20:59:07.277 に答える
2

別のアプローチsplit

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

コンポーネントが同じ次元を持つ場合、結果は簡単に に変換できるリストになりますdata.frame(この例ではこれが当てはまります)。

mydf2 <- do.call(cbind, mydfSplit)

このソリューションの問題は、最終結果の名前をきれいにする必要があることです。ただし、より一般的なデータの場合、SNがクラスごとに異なる場合に便利です。

于 2011-10-20T09:59:17.900 に答える
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))
于 2011-10-19T22:18:02.293 に答える