2013-08-14 64 views
10

Tôi có một data.frame trông như thế này:tổng hợp nhiều hàng của data.frame cùng trong R dựa trên các giá trị phổ biến ở cột trao

# 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 

Như bạn có thể nhìn thấy các cột sizeweight làm không thêm bất kỳ sự phức tạp nào vì chúng giống nhau cho mỗi item. Tuy nhiên, có thể có nhiều số value s cho cùng một số item.

Tôi muốn sụp đổ các data.frame có một hàng cho mỗi item sử dụng giá trị trung bình value:

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

Tôi đoán tôi phải sử dụng chức năng aggregate nhưng tôi không thể tìm ra cách chính xác tôi có thể nhận kết quả trên.

Trả lời

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

Các data.table giải pháp ...

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

Dưới đây là giải pháp sử dụng ddply từ gói 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

Tôi đã bỏ ra hàng giờ để suy nghĩ về cách vector hóa lồng nhau cho các vòng cố gắng xác định các hàng trùng lặp và trung bình chúng, đưa chúng trở lại vào data.frame, v.v. Đẹp! Giới thiệu về đầu tư vào giáo dục nhiều hơn với các tài liệu tại https://www.rdocumentation.org/packages/plyr/versions/1.8.4/topics/ddply. Cảm ơn!! – mightypile

0

Ngày nay, đây là những gì tôi sẽ làm gì:

require(dplyr) 

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

Điều này mang lại kết quả sau:

# 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 

Tôi sẽ rời khỏi câu trả lời được chấp nhận như vậy khi tôi đặc biệt yêu cầu aggregate, nhưng tôi tìm ra giải pháp dplyr sự dễ đọc nhất.

Các vấn đề liên quan