2012-10-11 28 views
21

Powiel możliwe:
This R reshaping should be simple, butCzy dcast może być używany bez funkcji agregującej?

dcast z reshape2 prace bez wzoru, gdzie nie ma duplikatów. Weź te przykładowe dane:

df <- structure(list(id = c("A", "B", "C", "A", "B", "C"), cat = c("SS", 
"SS", "SS", "SV", "SV", "SV"), val = c(220L, 222L, 223L, 224L, 
225L, 2206L)), .Names = c("id", "cat", "val"), class = "data.frame", row.names = c(NA, 
-6L)) 

Chciałbym dcast tych danych i po prostu mieć wartości w tabeli, bez stosowania żadnych funkcji do value.var tym domyślnie length.

W tym przypadku działa poprawnie.

> dcast(df, id~cat, value.var="val") 
    id SS SV 
1 A 220 224 
2 B 222 225 
3 C 223 2206 

Ale gdy istnieją zduplikowane zmienne, że fun domyślnie length. Czy istnieje sposób, aby tego uniknąć?

df2 <- structure(list(id = c("A", "B", "C", "A", "B", "C", "C"), cat = c("SS", 
"SS", "SS", "SV", "SV", "SV", "SV"), val = c(220L, 222L, 223L, 
224L, 225L, 220L, 1L)), .Names = c("id", "cat", "val"), class = "data.frame", row.names = c(NA, 
-7L)) 

> dcast(df2, id~cat, value.var="val") 
Aggregation function missing: defaulting to length 
    id SS SV 
1 A 1 1 
2 B 1 1 
3 C 1 2 

Idealnie co szukam jest dodanie fun = NA, jak w nie próbuj Grupowanie value.var. Wynik Chciałbym kiedy dcasting df2:

id SS SV 
1 A 220 224 
2 B 222 225 
3 C 223 220 
4. C NA 1 
+0

Co chcesz to zrobić, gdy nie jest powielanie? – Dason

+0

Po prostu dodaj to jako kolejny wiersz z "NA" dla brakujących wartości. – Maiasaura

+0

@Dason Czy to jest koszerne, aby odpowiedzieć na moje własne pytanie teraz, gdy wymyśliłem rozwiązanie? Czy powinienem po prostu usunąć q? – Maiasaura

Odpowiedz

19

nie sądzę, istnieje sposób, aby to zrobić bezpośrednio, ale możemy dodać dodatkowe kolumny, które pomogą nam się

df2 <- structure(list(id = c("A", "B", "C", "A", "B", "C", "C"), cat = c("SS", 
"SS", "SS", "SV", "SV", "SV", "SV"), val = c(220L, 222L, 223L, 
224L, 225L, 220L, 1L)), .Names = c("id", "cat", "val"), class = "data.frame", row.names = c(NA, 
-7L)) 

library(reshape2) 
library(plyr) 
# Add a variable for how many times the id*cat combination has occured 
tmp <- ddply(df2, .(id, cat), transform, newid = paste(id, seq_along(cat))) 
# Aggregate using this newid and toss in the id so we don't lose it 
out <- dcast(tmp, id + newid ~ cat, value.var = "val") 
# Remove newid if we want 
out <- out[,-which(colnames(out) == "newid")] 
> out 
# id SS SV 
#1 A 220 224 
#2 B 222 225 
#3 C 223 220 
#4 C NA 1 
+0

Dzięki, doszedłem do tego samego wniosku. – Maiasaura

9

Rozgryzłem to samo rozwiązanie, podczas gdy Dason odpowiadał na moje pytanie.

Zdałem sobie sprawę, że dcast po prostu nie wie, jak radzić sobie z duplikatami. Sposób, w jaki zorientowałem się, jak oszukać, polegał na dodaniu kolejnego unikalnego identyfikatora, aby nie był zdezorientowany przez duplikaty.

W tym przykładzie:

df <- ddply(df2, .(cat), function(x){ x$id2 = 1:nrow(x); x}) 
> dcast(df, id+id2~cat, value.var="val")[,-2] 
    id SS SV 
1 A 220 224 
2 B 222 225 
3 C 223 220 
4 C NA 1 
+0

, który był tak pomocny w podobnej sprawie dla mnie. Dziękuję :) – sarah

+0

Uratowałeś mi mój dzień !! –

Powiązane problemy