2014-03-02 61 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