web-dev-qa-db-ja.com

Rデータフレームの再配置:いくつかの行から列へ

質問に適切なタイトルを付ける方法すらわかりません。

データフレームdがあるとします。

現在のデータフレーム:

d <- data.frame(sample = LETTERS[1:2], cat = letters[11:20], count = c(1:10))

   sample cat count
1       A   k     1
2       B   l     2
3       A   m     3
4       B   n     4
5       A   o     5
6       B   p     6
7       A   q     7
8       B   r     8
9       A   s     9
10      B   t    10

そして、各猫の値が独自の列になり、サンプルが列のままになり(または行名になり)、カウントが新しい猫の列の値になり、0が0になるように再配置しようとしています。サンプルには猫の数がありません。そのようです:

必要なデータフレームレイアウト:

   sample   k   l   m   n   o   p   q   r   s   t
1       A   1   0   3   0   5   0   7   0   9   0
2       B   0   2   0   4   0   6   0   8   0  10

これについて行くための最良の方法は何ですか?

これは私が得た限りです:

for (i in unique(d$sample)) {
    s <- d[d$sample==i,]
    st <- as.data.frame(t(s[,3]))
    colnames(st) <- s$cat
    rownames(st) <- i
} 

つまり、元のデータフレーム内のサンプルをループし、サンプルサブセットごとに転置します。だからこの場合私は得る

   k m o q s
 A 1 3 5 7 9

そして

   l n p r  t
 B 2 4 6 8 10

そして、これは私が立ち往生しているところです。私はmerge()、bind()、apply()などでたくさんのことを試しましたが、正しいことを思いつかないようです。さらに、上記のループが必要なステップであるかどうか疑問に思わずにはいられません-おそらくunstack()で何か?

言うまでもなく、私はRに不慣れです...誰かが私を助けてくれるなら、それは大いにありがたいです!

PS Reasonデータフレームを再配置しようとしているのは、値のプロットを簡単にすることを目的としています(つまり、実際のdfを表形式のプロットで表示したい)。

ありがとうございました!

14
crs

ベースRからreshapeを使用する:

nn<-reshape(d,timevar="cat",idvar="sample",direction="wide")
names(nn)[-1]<-as.character(d$cat)
nn[is.na(nn)]<-0
> nn
  sample k l m n o p q r s  t
1      A 1 0 3 0 5 0 7 0 9  0
2      B 0 2 0 4 0 6 0 8 0 10
11
Metrics

Reshape2パッケージのdcastを使用します

> dcast(d, sample~cat, fill=0)
  sample k l m n o p q r s  t
1      A 1 0 3 0 5 0 7 0 9  0
2      B 0 2 0 4 0 6 0 8 0 10

ベースからのxtabsは別の選択肢です

> xtabs(count~sample+cat, d)
      cat
sample  k  l  m  n  o  p  q  r  s  t
     A  1  0  3  0  5  0  7  0  9  0
     B  0  2  0  4  0  6  0  8  0 10

出力をdata.frameにしたい場合は、次のことを試してください。

> as.data.frame.matrix(xtabs(count~sample+cat, d))
  k l m n o p q r s  t
A 1 0 3 0 5 0 7 0 9  0
B 0 2 0 4 0 6 0 8 0 10
15
Jilber Urbina