R中的数据转换

时间:2014-03-02 17:49:12

标签: r transform

我正在寻找一个用于转换数据帧的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',我不想要平均数或总和。

感谢您提供的任何帮助。

2 个答案:

答案 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")