2014-03-02 59 views
3

我正在寻找用于转换数据帧的R示例。 我有100行(每美国2行状态)R中的数据转换

 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函数做这种转变?

我试图使用'聚合'功能。但是,它期望一个参数,如:'平均'或'总和',我不想要平均数或总和。

我很感谢您提供的任何帮助。

回答

3

使用从reshape2包

require(reshape2) 
DB2 <- dcast(DB, State ~ Status, value.var="Count") 
colnames(DB2) <- c("State", "Count1", "Count2") 
+0

您可能需要重命名过的列。 –

+0

对我forgott。谢谢! – eclark

5

这里dcast功能有几种可能性:

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.

+0

不错的总结!我最喜欢的是'read.zoo'。 – cryo111