2014-09-19 10 views
12

Mam ramki danych, które stopiłem za pomocą pakietu przekształcania, które chciałbym "un stopić".Jak "odfiltrować" dane z przekształceniem r

tutaj jest przykład zabawki stopionego danych (rzeczywisty ramki danych 500x100 lub większe)

variable<-c(rep("X1",3),rep("X2",3),rep("X3",3)) 
value<-c(rep(rnorm(1,.5,.2),3),rep(rnorm(1,.5,.2),3),rep(rnorm(1,.5,.2),3)) 
dat <-data.frame(variable,value) 
dat 
variable  value 
1  X1 0.5285376 
2  X1 0.5285376 
3  X1 0.5285376 
4  X2 0.1694908 
5  X2 0.1694908 
6  X2 0.1694908 
7  X3 0.7446906 
8  X3 0.7446906 
9  X3 0.7446906 

Każda zmienna (X1, X2, X3) ma wartości oszacowano na 3 razy (który w tym przykład zabawki jest taki sam, ale nigdy tak nie jest).

chciałabym je zdobyć (z tyłu) w formie:

 X1  X2  X3 
1 0.5285376 0.1694908 0.7446906 
2 0.5285376 0.1694908 0.7446906 
3 0.5285376 0.1694908 0.7446906 

Zasadniczo chciałbym kolumna zmienną być klasyfikowane na ID (X1, X2, itd) i stać nagłówki kolumn. Próbowałem różnych permutacji odlewu, dcastu, przekształcenia itp. I nie mogę uzyskać danych w formacie, który chcę. Łatwo było "stopić" dane z szerokiej formy do dłuższej formy (na przykład zestawu danych), ale jej odzyskanie okazało się trudne. Jakieś pomysły? Wiem, że to jest stosunkowo proste, ale mam trudny konceptualizacji, jak to zrobić w przekształceniu lub przekształceniu2.

Dzięki, LP

+0

To trochę trudne, ponieważ w Twoich stopionych danych straciłeś informacje o tym, w którym wierszu był pierwotnie, to jest, w którym z trzech razy został oszacowany. Jeśli chcesz założyć, że zawsze było 1-2-3 (lub 1-2, jeśli są tylko dwa), możesz utworzyć wiersz z tymi informacjami, a następnie odrzucić go. – Aaron

Odpowiedz

19

I zazwyczaj to zrobić przez utworzenie kolumny id, a następnie za pomocą dcast:

> dat 
    variable  value 
1  X1 0.4299397 
2  X1 0.4299397 
3  X1 0.4299397 
4  X2 0.2531551 
5  X2 0.2531551 
6  X2 0.2531551 
7  X3 0.3972119 
8  X3 0.3972119 
9  X3 0.3972119 
> dat$id <- rep(1:3,times = 3) 
> dcast(data = dat,formula = id~variable,fun.aggregate = sum,value.var = "value") 
    id  X1  X2  X3 
1 1 0.4299397 0.2531551 0.3972119 
2 2 0.4299397 0.2531551 0.3972119 
3 3 0.4299397 0.2531551 0.3972119 
+2

Jak wspominają, że liczba wartości może nie być zgodna, może rozważyć zmianę 'dat $ id' na coś podobnego' z (dat, ave (rep (1, nrow (dat)), zmienna, FUN = seq_along)) '. – A5C1D2H2I1M1N2O1R2T1

+0

ahh, dzięki. Brakowało mi identyfikatora. Działa to dobrze dla tego konkretnego zestawu danych, który został wygenerowany za pomocą symulacji. –

1

W zależności od tego, jak mocny trzeba to będzie, co następuje będzie prawidłowo oddanych na różnym liczba wystąpień zmiennych (w dowolnej kolejności).

> variable<-c(rep("X1",5),rep("X2",4),rep("X3",3)) 
> value<-c(rep(rnorm(1,.5,.2),5),rep(rnorm(1,.5,.2),4),rep(rnorm(1,.5,.2),3)) 
> dat <-data.frame(variable,value) 
> dat <- dat[order(rnorm(nrow(dat))),] 
> dat 
    variable  value 
11  X3 1.0294454 
8  X2 0.6147509 
2  X1 0.3537012 
7  X2 0.6147509 
9  X2 0.6147509 
5  X1 0.3537012 
4  X1 0.3537012 
12  X3 1.0294454 
3  X1 0.3537012 
1  X1 0.3537012 
10  X3 1.0294454 
6  X2 0.6147509 
> dat$id = numeric(nrow(dat)) 
> for (i in 1:nrow(dat)){ 
+ dat_temp <- dat[1:i,] 
+ dat[i,]$id <- nrow(dat_temp[dat_temp$variable == dat[i,]$variable,]) 
+ } 
> cast(dat, id~variable, value = 'value') 
    id  X1  X2  X3 
1 1 0.3537012 0.6147509 1.029445 
2 2 0.3537012 0.6147509 1.029445 
3 3 0.3537012 0.6147509 1.029445 
4 4 0.3537012 0.6147509  NA 
5 5 0.3537012  NA  NA 
Powiązane problemy