Mam dataframe z 2 kolumnami:

  .id vals
1   A   10
2   B   20
3   C   30
4   A  100
5   B  200
6   C  300

dput(tst_df)
structure(list(.id = structure(c(1L, 2L, 3L, 1L, 2L, 3L), .Label = c("A", 
"B", "C"), class = "factor"), vals = c(10, 20, 30, 100, 200, 
300)), .Names = c(".id", "vals"), row.names = c(NA, -6L), class = "data.frame")

Teraz chcę mieć kolumnę .id, aby stać się moimi nazwami kolumnami, a Vals stanie się 2 rzędami.

Lubię to:

A    B    C
10   20   30
100  200  300

Zasadniczo .id jest moją zmienną grupową i chcę mieć wszystkie wartości należące do 1 grupy jako rzędu. Spodziewałem się czegoś prostego jak stopić i przekształcić. Ale po wielu próbach, wciąż nie udało mi się udało. Czy ktoś jest zaznajomiony z funkcją, która to osiągnie?

2
Sander Van der Zeeuw 15 luty 2017, 17:44

2 odpowiedzi

Najlepsza odpowiedź

Możesz to zrobić w bazie r z unstack:

unstack(df, form=vals~.id)
    A   B   C
1  10  20  30
2 100 200 300

Pierwszym argumentem jest nazwa danych.frame, a druga jest formułą, która określa niestotną strukturę.

2
lmo 15 luty 2017, 14:49

Możesz także użyć tapply,

do.call(cbind, tapply(df$vals, df$.id, I))
#       A   B   C
#[1,]  10  20  30
#[2,] 100 200 300

Lub owinąć go w ramce danych, tj.

as.data.frame(do.call(cbind, tapply(df$vals, df$.id, I)))
2
Sotos 15 luty 2017, 15:03