Transformasi data di R

Saya mencari contoh R untuk mengubah kerangka data. Saya memiliki kerangka data dengan 100 baris (2 baris per negara bagian AS)

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

Transformasi yang saya inginkan adalah kerangka data dengan 50 baris:

      State Count1  Count2 
        AK   15       71
        AL   56      428
        AR   33      228
        AZ  132      801
       .... 

Bisakah Anda menyarankan fungsi R untuk melakukan transformasi ini?

Saya mencoba menggunakan fungsi 'agregat'. Namun, ia mengharapkan parameter seperti: 'mean' OR 'Sum', dan saya tidak ingin mean atau sum.

Saya menghargai bantuan apa pun yang dapat Anda berikan.


person Rem    schedule 02.03.2014    source sumber


Jawaban (2)


Berikut beberapa kemungkinannya:

1) xtab

> xtabs(Count ~ State + Status, DF)
     Status
State default nodefault
   AK      15        71
   AL      56       428
   AR      33       228
   AZ     132       801

2) ketuk

> tapply(DF[[3]], DF[2:1], c)
     Status
State default nodefault
   AK      15        71
   AL      56       428
   AR      33       228
   AZ     132       801

3) membentuk ulang

> 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 dalam paket reshape2 ada kemungkinan lain yang berfungsi seperti reshape.

4) baca.kebun binatang

> 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) pisahkan/gabungkan

> 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

Hal ini juga dapat dinyatakan sebagai:

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

TAMBAHKAN solusi 5.

person G. Grothendieck    schedule 02.03.2014

Gunakan fungsi dcast dari paket reshape2

require(reshape2)
DB2 <- dcast(DB, State ~ Status, value.var="Count")
colnames(DB2) <- c("State", "Count1", "Count2")
person eclark    schedule 02.03.2014
comment
Anda mungkin perlu mengganti nama kolom juga. - person Ben Bolker; 02.03.2014
comment
Benar aku lupa. Terima kasih! - person eclark; 02.03.2014