R 松开数据框上的x个选项卡

R 松开数据框上的x个选项卡,r,R,我在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

我在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)
我正试图使用以下代码来实现这一点

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

如您所见,我非常接近所需的格式,但我不确定如何使当前输出与所需输出匹配。任何想法或提示都将不胜感激。

我确信有一种方法可以通过
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

更新以包括所需输出中所示的缺失变量组合。

方式我猜,效率比@joran的解决方案低——当然可读性也低很多(但仍然对“事情就是这样”的方式感兴趣)如果您想从
xtabs
转换为
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

temp I在回答
xtabs
(这几乎是押韵的)。不太漂亮。@mrdwab-+1表示努力。:)天哪。如果你尝试了几次,你可以说你用
xtabs
。@Wojeciech Sobala-+1尝试了几次答案,这是一种很好的替代方法!
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
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
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