我在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
正如您所看到的,我非常接近所需的格式,但我不确定如何使我的当前输出与我想要的输出相匹配。任何想法或提示都将不胜感激。
答案 0 :(得分: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
更新为包含所需输出中指示的缺失变量组合。
答案 1 :(得分:2)
WAY 效率低,我猜,比@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
哎哟。
答案 2 :(得分: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