2016-01-24 25 views
7

Tôi có một khung dữ liệu lớn (1616610 hàng, 255 cột) và tôi cần phải dán các giá trị duy nhất của mỗi cột dựa trên một khóa.Tổng hợp tất cả các giá trị duy nhất của mỗi cột của khung dữ liệu

Ví dụ:

> data = data.frame(a=c(1,1,1,2,2,3), 
       b=c("apples", "oranges", "apples", "apples", "apples", "grapefruit"), 
       c=c(12, 22, 22, 45, 67, 28), 
       d=c("Monday", "Monday", "Monday", "Tuesday", "Wednesday", "Tuesday")) 
> data 
    a   b c   d 
1 1  apples 12 Monday 
2 1 oranges 22 Monday 
3 1  apples 22 Monday 
4 2  apples 45 Tuesday 
5 2  apples 67 Wednesday 
6 3 grapefruit 28 Tuesday 

Những gì tôi cần là để tổng hợp mỗi giá trị duy nhất trong mỗi 255 cột, và trả về một khung dữ liệu mới có dải phân cách bởi dấu phẩy cho mỗi giá trị duy nhất. Như thế này:

a    b  c     d 
1 1 apples, oranges 12, 22    Monday 
2 2   apples 45, 67 Tuesday, Wednesday 
3 3  grapefruit  28   Thursday 

Tôi đã cố gắng sử dụng aggregate, như vậy:

output <- aggregate(data, by=list(data$a), paste, collapse=", ") 

nhưng đối với một khung dữ liệu kích thước này, nó đã quá tốn thời gian (giờ), và thường lần tôi có để giết tất cả quá trình. Trên hết, điều này sẽ tổng hợp tất cả các giá trị và không chỉ các giá trị duy nhất. Có ai có bất cứ lời khuyên trên:

1) làm thế nào để cải thiện thời gian của sự kết hợp này cho dữ liệu lớn đặt

2) sau đó nhận được những giá trị độc đáo của từng lĩnh vực

BTW, đây là bài viết đầu tiên của tôi trên SO, vì vậy cảm ơn sự kiên nhẫn của bạn.

+0

Đối với kích thước đó, bạn có thể sẽ cần 'data .table'. Tôi không tuyệt vời với cú pháp của nó, nhưng có những người ở đây. – alistaire

+0

cảm ơn @alistaire. Tôi đã nghe những điều tốt đẹp về 'data.table' cho các tập dữ liệu lớn, và đã thử làm việc với nó, nhưng tôi dường như không thể tìm ra cú pháp cho vấn đề này. – bab2155

+0

Cảm ơn @ G.Gothendieck! Điều đó làm việc tốt – bab2155

Trả lời

6

Moved từ nhận xét:

library(data.table) 

dt <- as.data.table(data) 
dt[, lapply(.SD, function(x) toString(unique(x))), by = a] 

cho:

a    b  c     d 
1: 1 apples, oranges 12, 22    Monday 
2: 2   apples 45, 67 Tuesday, Wednesday 
3: 3  grapefruit  28   Tuesday 
+0

cảm ơn @G. Grothendieck. Làm việc tuyệt vời. – bab2155

2

Bạn có thể làm như sau với dplyr

func_paste <- function(x) paste(unique(x), collapse = ', ') 
data %>% 
    group_by(a) %>% 
    summarise_each(funs(func_paste)) 

##  a    b  c     d 
## (dbl)   (chr) (chr)    (chr) 
##1  1 apples, oranges 12, 22    Monday 
##2  2   apples 45, 67 Tuesday, Wednesday 
##3  3  grapefruit  28   Tuesday 
+0

Trong một, 'dữ liệu%>% nhóm_by (a)%>% summaryise_each (funs (dán (duy nhất (.), Collapse = ',')))'. Nó chậm hơn 'tổng hợp' ban đầu, mặc dù nó trả về kết quả chính xác, ít nhất. – alistaire

+0

@alistaire Cảm ơn bạn đã thử nghiệm và loại bỏ sự cần thiết cho một chức năng riêng biệt. Thật khó để đánh bại một giải pháp 'data.table' cho tốc độ chạy. – steveb

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