4

Rに次のデータフレームがあります

  LOCATION COLOR  STATE
1 A        green  fresh
2 A        red    rotten
3 B        green  fresh
4 B        green  fresh
5 C        red    fresh
6 C        green  rotten

上記のデータ フレームは、次のスクリプトを使用して R で作成できます。

dat <- read.table(text = "LOCATION COLOR STATE
1 A green fresh
2 A red rotten
3 B green fresh
4 B green fresh
5 C red fresh
6 C green rotten",header = TRUE,sep = "",row.names = 1)

次の出力を得るためにデータフレームを再配置しようとしています

  LOCATION COLOR ROTTEN FRESH
1 A        red    1      0
2 A        green  0      1
3 B        red    0      0
4 B        green  0      2
5 C        red    0      1
6 C        greed  1      0

次のコードを使用してこれを実行しようとしています

dat <- as.data.frame(unclass(xtabs(~ LOCATION  + COLOR + STATE,dat)))

それは私に与えます

            green.fresh   red.fresh  green.rotten red.rotten
1  A            1           0            0          1
2  B            2           0            0          0
3  C            0           1            1          0

ご覧のとおり、目的の形式に非常に近づいていますが、現在の出力を目的の出力と一致させる方法がわかりません。アイデアやヒントをいただければ幸いです。

4

3 に答える 3

6

これを行う方法があると確信していますが、代わりxtabsに使用する傾向があります。dcast

library(reshape2)
dcast(dat,LOCATION+COLOR~STATE,
      fun.aggregate = length,value.var = "STATE",drop = FALSE)
  LOCATION COLOR fresh rotten
1        A green     1      0
2        A   red     0      1
3        B green     2      0
4        B   red     0      0
5        C green     0      1
6        C   red     1      0

必要な出力に示されているように、欠落している変数の組み合わせを含めるように更新されました。

于 2012-11-29T17:00:25.623 に答える
2

@joranのソリューションよりもはるかに効率が悪いと思いますが、確かに読みにくくなっています(ただし、「これがどのように機能するか」という点では興味深いです)xtabs。 a data.frame

temp <- xtabs(~ LOCATION  + COLOR + STATE, dat)
data.frame(expand.grid(rev(attr(ftable(temp), "row.vars"))),
           setNames(as.data.frame.matrix(ftable(temp)), 
                    rev(attr(ftable(temp), "col.vars")$STATE)))
#   COLOR LOCATION rotten fresh
# 1 green        A      1     0
# 2   red        A      0     1
# 3 green        B      2     0
# 4   red        B      0     0
# 5 green        C      0     1
# 6   red        C      1     0

痛い。

于 2012-11-29T18:57:11.190 に答える
1
aggregate(cbind(FRESH,ROTTEN)~LOCATION+COLOR,
  data=transform(dat,FRESH=1L*(STATE=="fresh"),ROTTEN=1L*(STATE=="rotten")),
  FUN=sum)


  LOCATION COLOR FRESH ROTTEN
1        A green     1      0
2        B green     2      0
3        C green     0      1
4        A   red     0      1
5        C   red     1      0
于 2012-11-29T20:31:25.683 に答える