我正在寻找一个用于转换数据帧的R示例。 我有一个100行的数据帧(每个US状态2行)
Status State Count
default AK 15
nodefault AK 71
default AL 56
nodefault AL 428
default AR 33
nodefault AR 228
default AZ 132
nodefault AZ 801
......
......
我想要的转换是一个包含50行的数据框:
State Count1 Count2
AK 15 71
AL 56 428
AR 33 228
AZ 132 801
....
你能建议任何R功能进行这种转换吗?
我尝试使用'聚合'功能。但是,它需要一个参数,例如:' mean'或者' Sum',我不想要平均数或总和。
感谢您提供的任何帮助。
答案 0 :(得分:5)
以下是一些可能性:
1)xtabs
> xtabs(Count ~ State + Status, DF)
Status
State default nodefault
AK 15 71
AL 56 428
AR 33 228
AZ 132 801
2)tapply
> tapply(DF[[3]], DF[2:1], c)
Status
State default nodefault
AK 15 71
AL 56 428
AR 33 228
AZ 132 801
3)重塑
> reshape(data = DF, dir = "wide", idvar = "State", timevar = "Status")
State Count.default Count.nodefault
1 AK 15 71
3 AL 56 428
5 AR 33 228
7 AZ 132 801
reshape2包中的 dcast
是另一种可能与reshape
类似的行为。
4)read.zoo
> library(zoo)
>
> read.zoo(DF, index = "State", split = "Status", FUN = identity)
default nodefault
AK 15 71
AL 56 428
AR 33 228
AZ 132 801
5)拆分/合并
> do.call("merge", c(unname(split(DF, DF$Status)), by = 2))[c(-2, -4)]
State Count.x Count.y
1 AK 15 71
2 AL 56 428
3 AR 33 228
4 AZ 132 801
这也可以表示为:
s <- split(DF, DF$Status)
merge(s[[1]], s[[2]], by = 2)[c(-2, -4)]
或
with(split(DF, DF$Status), merge(default, nodefault, by = 2))[c(-2, -4)]
ADDED 解决方案5.
答案 1 :(得分:3)
使用reshape2包中的dcast功能
require(reshape2)
DB2 <- dcast(DB, State ~ Status, value.var="Count")
colnames(DB2) <- c("State", "Count1", "Count2")