我正在寻找一个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
......
......
Run Code Online (Sandbox Code Playgroud)
我想要的转换是一个包含50行的数据框:
State Count1 Count2
AK 15 71
AL 56 428
AR 33 228
AZ 132 801
....
Run Code Online (Sandbox Code Playgroud)
你能建议任何R函数进行这种转换吗?
我试图使用'聚合'功能.但是,它需要一个参数,例如:'mean'OR'Sum',我不想要均值或求和.
我感谢您提供的任何帮助.
以下是一些可能性:
1)xtabs
> xtabs(Count ~ State + Status, DF)
Status
State default nodefault
AK 15 71
AL 56 428
AR 33 228
AZ 132 801
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
dcast在reshape2包中是另一种可能有点像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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
这也可以表示为:
s <- split(DF, DF$Status)
merge(s[[1]], s[[2]], by = 2)[c(-2, -4)]
Run Code Online (Sandbox Code Playgroud)
要么
with(split(DF, DF$Status), merge(default, nodefault, by = 2))[c(-2, -4)]
Run Code Online (Sandbox Code Playgroud)
添加解决方案5.