Преобразование данных в R

Я ищу пример R для преобразования кадра данных. У меня есть фрейм данных со 100 строками (по 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 для выполнения этого преобразования?

Я попытался использовать функцию «агрегат». Однако он ожидает такой параметр, как «среднее» ИЛИ «сумма», и мне не нужно среднее значение или сумма.

Я ценю любую помощь, которую вы можете предоставить.


person Rem    schedule 02.03.2014    source источник


Ответы (2)


Вот несколько возможностей:

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(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

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

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)]

or

with(split(DF, DF$Status), merge(default, nodefault, by = 2))[c(-2, -4)]

ДОБАВЛЕНО решение 5.

person G. Grothendieck    schedule 02.03.2014

Используйте функцию dcast из пакета reshape2

require(reshape2)
DB2 <- dcast(DB, State ~ Status, value.var="Count")
colnames(DB2) <- c("State", "Count1", "Count2")
person eclark    schedule 02.03.2014
comment
вам также может понадобиться переименовать столбцы. - person Ben Bolker; 02.03.2014
comment
Точно забыл. Спасибо! - person eclark; 02.03.2014