2014-05-07 20 views
5

Tôi có câu hỏi tương tự như: R: data.table : searching on multiple columns AND setting data type, nhưng câu hỏi này không được trả lời đầy đủ. Tôi có một bảng cặp đôi trông giống như dưới đây. Bảng này là kết quả của việc chuyển đổi một ma trận khoảng cách rất lớn thành một data.table (> 100,000,000 hàng), sao cho so sánh a, b giống như b, a. Tuy nhiên a và b có thể xuất hiện trong cột V1 hoặc V2. Tôi muốn tính toán số liệu thống kê tóm tắt đơn giản bằng cách sử dụng kiểu truy vấn data.table, nhưng tôi đã không hoàn toàn tìm ra cách chọn các khóa trong một trong hai cột. Điều này có thể không?R Data.table cho thống kê tóm tắt tính toán trên nhiều cột

Tôi đã thử cài đặt các phím theo một trong hai hướng, nhưng điều này chỉ trả lại dữ liệu cho cột đó. Tôi cũng đã thử sử dụng danh sách(), nhưng điều đó trả về giao lộ (dễ hiểu), tôi hy vọng cho một by = key1 | key2, nhưng không may mắn như vậy.


> set.seed(123) 
> 
> #create pairwise data 
> a<-data.table(t(combn(3,2))) 
> #create column that is equal both ways, 1*2 == 2*1 
> dat<-a[,data:=V1*V2] 
> dat 
    V1 V2 data 
1: 1 2 2 
2: 1 3 3 
3: 2 3 6 
#The id ==2 is the problem here, the mean should be 4 ((2+6)/2) 

> #set keys 
> setkey(dat,V1,V2) 
> 
> #One way data 
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=V1] 
> dat 
    V1 V2 data MEAN VAR 
1: 1 2 2 2.5 0.5 
2: 1 3 3 2.5 0.5 
3: 2 3 6 6.0 NA 

> #The other way 
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=V2] 
> dat 
    V1 V2 data MEAN VAR 
1: 1 2 2 2.0 NA 
2: 1 3 3 4.5 4.5 
3: 2 3 6 4.5 4.5 
> 
> #The intersect just produces the original data 
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=list(V1,V2)] 
> dat 
    V1 V2 data MEAN VAR 
1: 1 2 2 2 NA 
2: 1 3 3 3 NA 
3: 2 3 6 6 NA 
> 
> #Meaningless but hopefull attempt. 
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=V1|V2] 
> dat 
    V1 V2 data  MEAN  VAR 
1: 1 2 2 3.666667 4.333333 
2: 1 3 3 3.666667 4.333333 
3: 2 3 6 3.666667 4.333333 
#The goal is to create a table would look like this (using mean as an example) 
ID MEAN 
1 2.5 
2 4.0 
3 4.5 

ý tưởng mặc định của tôi sẽ là quá vòng lặp thông qua một dat [V1 == x | V2 == x] tuyên bố, nhưng tôi không nghĩ rằng tôi đang khai thác toàn bộ sức mạnh của data.table để trả về một cột số đơn lẻ có nghĩa là cột var làm cột tóm tắt.

Cảm ơn bạn!

+1

những gì chính xác là dự kiến ​​của bạn kết quả ở đây? – eddi

+0

được chỉnh sửa để phản ánh kết quả hy vọng, là một cột id duy nhất có giá trị trung bình và var cho ID đó. Cảm ơn bạn đã giúp làm rõ. – bw4sz

Trả lời

4

nó sẽ được dễ dàng nhất để sắp xếp lại dữ liệu của bạn một chút để đạt được những gì bạn muốn (Tôi đang sử dụng tái chế data dưới đây không phải gõ c(data, data) trong phần đầu tiên):

dat[, list(c(V1, V2), data)][, list(MEAN = mean(data)), by = V1] 
# V1 MEAN 
#1: 1 2.5 
#2: 2 4.0 
#3: 3 4.5 
Các vấn đề liên quan