2012-07-20 38 views
18

Nó có vẻ như một vấn đề đơn giản như vậy, nhưng tôi đã được kéo tóc của tôi ra cố gắng để có được điều này để làm việc:tổng hợp (count) hàng phù hợp với một điều kiện, nhóm bởi giá trị duy nhất

Với khung dữ liệu này xác định sự tương tác id đã có với contact người được nhóm lại theo contactGrp,

head(data) 
    id    sesTs contact contactGrp relpos maxpos 
1 6849 2012-06-25 15:58:34 peter  west 0.000000  3 
2 6849 2012-06-25 18:24:49 sarah  south 0.500000  3 
3 6849 2012-06-27 00:13:30 sarah  south 1.000000  3 
4 1235 2012-06-29 17:49:35 peter  west 0.000000  2 
5 1235 2012-06-29 23:56:35 peter  west 1.000000  2 
6 5893 2012-06-30 22:21:33 carl   east 0.000000  1 

có bao nhiêu địa chỉ liên lạc, nơi có cho unique(data$contactGrp) với relpos=1maxpos>1?

Một Kết quả dự kiến ​​sẽ là:

1 west 1 
2 south 1 
3 east 0 

Một nhóm nhỏ các dòng tôi đã cố gắng:

  • aggregate(data, by=list('contactGrp'), FUN=count) mang lại một lỗi, không lọc
  • sử dụng data.table dường như đòi hỏi một chìa khóa, không phải là duy nhất trong dữ liệu này…
  • ddply(data,"contactGrp",summarise,count=???) không chắc chắn nên sử dụng chức năng nào để điền vào count cột
  • ddply(subset(data,maxpos>1 & relpos==0), c('contactGrp'), function(df)count(df$relpos)) công trình nhưng mang lại cho tôi thêm một cột x và nó cảm thấy như tôi đã overcomplicated nó ...

SQL sẽ được dễ dàng: Select contactGrp, count(*) as cnt from data where … Group by contactGrp nhưng im cố gắng tìm hiểu R

+0

Tôi nghĩ bạn có nghĩa là 'tây 2, đông 0, nam 0' cho kết quả mong đợi của bạn. – joran

+0

thực sự relpos = 1. Nhưng có cho relpos = 0 kết quả mong đợi được liệt kê sai ... –

+0

Gah! Bạn nói đúng, xin lỗi. Sáng sớm tôi đang ở đâu. :) – joran

Trả lời

19

Tôi nghĩ rằng đây là phiên bản ddply bạn đang tìm kiếm:

ddply(sessions,.(contactGrp), 
     summarise, 
     count = length(contact[relpos == 0 & maxpos > 1])) 
+0

Cảm ơn. Một số cú pháp đó có vẻ hơi mơ hồ đối với tôi: ký hiệu cột.(), Có thể tham chiếu đến _columnName_ [condition] như một tham số cho hàm length. Tôi cho rằng tôi có một số đọc để làm… –

+0

@LukasGrebe Xin lỗi, ký hiệu '.()' Là một thói quen của tôi, nhưng không thực sự cần thiết. Bạn cũng có thể chỉ định các biến nhóm với một cái gì đó như 'c (" contactGrp ")'. – joran

+0

không sao. đã học được điều gì đó :) –

10

Dưới đây là một cách tiếp cận khác:

a <- data.frame(id=1:10, contact=sample(c("peter", "sahrah"), 10, T), contactGrp=sample(c("west", "east"), 10, T), relpos=sample(0:1, 10, T), maxpos=runif(10, 0,10)) 

library(sqldf) 
sqldf("Select contactGrp, count(*) as cnt from a where relpos=0 and maxpos > 1 Group by contactGrp") 
    contactGrp cnt 
1  east 3 
2  west 1 
22

Và đây là giải pháp data.table:

> library(data.table) 
> dt <- data.table(sessions) 
> dt[, length(contact[relpos == 0 & maxpos > 1]), by = contactGrp] 
    contactGrp V1 
[1,]  west 2 
[2,]  south 0 
[3,]  east 0 

> dt[, length(contact[relpos == 1 & maxpos > 1]), by = contactGrp] 
    contactGrp V1 
[1,]  west 1 
[2,]  south 1 
[3,]  east 0 
10

dòng nỗ lực đầu tiên của bạn với tổng không hoạt động vì không có chức năng count. Bạn có nghĩa là length. Tất cả những gì bạn phải làm là thực thi với lựa chọn dữ liệu có điều kiện cho relpos và maxpos, và cũng chọn một biến giả để đếm số đếm (không quan trọng). Tuy nhiên, thay vì sử dụng các lệnh tổng hợp linh hoạt các loại được xây dựng trong lệnh table được thiết kế chỉ cho việc này.

with(data[data$relpos == 1 & data$maxpos > 1,], table(contactGrp)) 
Các vấn đề liên quan