SORU
8 Mart 2012, PERŞEMBE


Üç sütun veri matrisi için çerçeve yeniden şekillendirmek

Bu gibi görünüyor data.frame Bir ben var.

x a 1 
x b 2 
x c 3 
y a 3 
y b 3 
y c 2 

Bu bir komplo yapmak için ısı haritası için beslenmem matris formunda bunu istiyorum. Sonuç aşağıdaki gibi görünmelidir:

    a    b    c
x   1    2    3
y   3    3    2

cast paket yeniden şekillendirmek dan denedim ve bunu yapmak için el ile bir fonksiyon yazmaya çalıştım ama başaramadım.

CEVAP
8 Mart 2012, PERŞEMBE


Bunu yapmak için birçok yol vardır. Bu cevap benim en sevdiğim yollar ile başlar, ama aynı zamanda benzer soruların cevaplarını çeşitli şekillerde bu site dağılmış toplar.

tmp <- data.frame(x=gl(2,3, labels=letters[24:25]),
                  y=gl(3,1,6, labels=letters[1:3]), 
                  z=c(1,2,3,3,3,2))

Reshape2 kullanarak:

library(reshape2)
acast(tmp, x~y, value.var="z")

Matris indeksleme kullanarak:

with(tmp, {
  out <- matrix(nrow=nlevels(x), ncol=nlevels(y),
                dimnames=list(levels(x), levels(y)))
  out[cbind(x, y)] <- z
  out
})

xtabs kullanarak:

xtabs(z~x y, data=tmp)

Ayrıca burada önerilen reshape kullanabilirsiniz: küçük bir manipülasyon daha sonra yapmak için fazladan bir sütun Kaldır ve isim hakkı (gösterilmez). almak için olsa da Convert table into matrix by column names,

> reshape(tmp, idvar="x", timevar="y", direction="wide")
  x z.a z.b z.c
1 x   1   2   3
4 y   3   3   2

Burada görüldüğü gibi aynı zamanda Matrix paket içinde sparseMatrix var: R - convert BIG table into matrix by column names

> with(tmp, sparseMatrix(i = as.numeric(x), j=as.numeric(y), x=z,
                         dimnames=list(levels(x), levels(y))))
2 x 3 sparse Matrix of class "dgCMatrix"
  a b c
x 1 2 3
y 3 3 2

plyr kütüphane daply işlevi de kullanılabilir, burada: http://stackoverflow.com/a/7020101/210673

> library(plyr)
> daply(tmp, .(x, y), function(x) x$z)
   y
x   a b c
  x 1 2 3
  y 3 3 2

Reshape2 dcast da çalışır, burada: Reshape data for values in one column ama bir veri olsun.x değeri için bir sütun ile çerçeve.

> dcast(tmp, x~y, value.var="z")
  x a b c
1 x 1 2 3
2 y 3 3 2

"Tidyr" de böyle bir değişim için çalışmak: . benzer şekilde, spread

library(tidyr)
spread(tmp, y, z)
#   x a b c
# 1 x 1 2 3
# 2 y 3 3 2

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Charles Renaud

    Charles Rena

    10 Kasım 2007
  • Jonathan Flavell

    Jonathan Fla

    1 HAZİRAN 2006
  • Max Lee

    Max Lee

    18 AĞUSTOS 2006