2013-08-14 13 views
10

mam data.frame, które wygląda następująco:kruszywa wiele wierszy o tej samej data.frame w badania opartego na wspólnych wartościach podanych w kolumnach

# set example data 
df <- read.table(textConnection("item\tsize\tweight\tvalue 
A\t2\t3\t4 
A\t2\t3\t6 
B\t1\t2\t3 
C\t3\t2\t1 
B\t1\t2\t4 
B\t1\t2\t2"), header = TRUE) 

# print example data 
df 
item size weight value 
1 A 2  3  4 
2 A 2  3  6 
3 B 1  2  3 
4 C 3  2  1 
5 B 1  2  4 
6 B 1  2  2 

Jak można zobaczyć size i weight kolumny zrobić nie dodają żadnej złożoności, ponieważ są one takie same dla każdego item. Jednak może być wiele różnych value s dla tego samego item.

chcę zwinąć data.frame mieć jeden wiersz za item stosując średnią value:

item size weight value 
1 A 2  3  5 
3 B 1  2  3 
4 C 3  2  1 

Chyba trzeba użyć funkcji aggregate ale nie mogę dowiedzieć się, jak dokładnie mogę dostać powyższy wynik.

Odpowiedz

14
aggregate(value ~ item + size + weight, FUN = mean, data=df) 

    item size weight value 
1 B 1  2  3 
2 C 3  2  1 
3 A 2  3  5 
3
df$value <- ave(df$value,df$item,FUN=mean) 
df[!duplicated(df$item),] 

    item size weight value 
1 A 2  3  5 
3 B 1  2  3 
4 C 3  2  1 
3

data.table rozwiązanie ...

require(data.table) 
DT <- data.table(df) 

DT[ , lapply(.SD , mean) , by = item ] 
    item size weight value 
1: A 2  3  5 
2: B 1  2  3 
3: C 3  2  1 
3

Oto rozwiązanie przy użyciu ddply z pakietu plyr:

library(plyr) 
ddply(df,.(item),colwise(mean)) 
    item size weight value 
1 A 2  3  5 
2 B 1  2  3 
3 C 3  2  1 
+0

Po prostu spędziłem wiele godzin zastanawiając się, jak wektoryzować zagnieżdżone dla pętli, próbując ustalić zduplikowane wiersze i je uśrednić, umieścić je z powrotem w data.frame itd. Ta jedna linijka robi wszystko. Piękny! O inwestowaniu w więcej edukacji dzięki dokumentom na stronie https://www.rdocumentation.org/packages/plyr/versions/1.8.4/topics/ddply. Dzięki!! – mightypile

0

W dzisiejszych czasach jest to, co chciałbym zrobić:

require(dplyr) 

df %>% 
group_by(item, size, weight) %>% 
summarize(value = mean(value)) %>% 
ungroup 

To daje następujący wynik:

# A tibble: 3 x 4 
    item size weight value 
    <chr> <int> <int> <dbl> 
1  A  2  3  5 
2  B  1  2  3 
3  C  3  2  1 

odejdę przyjętej odpowiedzi jako takie jak specjalnie poprosił o aggregate, ale uważam, że rozwiązanie dplyr najbardziej czytelny.

Powiązane problemy