2013-08-26 29 views
5

Điều này là probablly khá đơn giản nhưng muốn có thể tóm tắt một số dữ liệu (trung bình và trung bình) dựa trên lựa chọn cột ngẫu nhiên, và cho nó được nhóm lại theo một cột khác nhau.R data.table cú pháp cho subsetting và tóm tắt

Xin vui lòng xem bên dưới:

DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9) 
ww <- sample(c("y","v"),1) 
DT[,list(avg=mean(ww),med=median(ww)),by="x"] 
    x avg med 
1: a NA y 
2: b NA y 
3: c NA y 
Warning messages: 
1: In `[.data.table`(DT, , list(avg = mean(ww), med = median(ww)), : 
    argument is not numeric or logical: returning NA 
2: In `[.data.table`(DT, , list(avg = mean(ww), med = median(ww)), : 
    argument is not numeric or logical: returning NA 
3: In `[.data.table`(DT, , list(avg = mean(ww), med = median(ww)), : 
argument is not numeric or logical: returning NA 

Nếu ví dụ ww đã xảy ra với bình đẳng "v" sau đó tôi mong chờ đầu ra sau đây

x avg med 
1: a 2 2 
2: b 5 5 
3: c 8 8 

Tôi nghĩ rằng nó chỉ là cú pháp mà tôi cần phải điều chỉnh, nhưng không chắc chắn cách điều chỉnh ... Bất kỳ trợ giúp nào sẽ được đánh giá cao ...

+0

Đây là một cách khác để thực hiện: 'DT [, lapply (danh sách (avg = mean, med = median), hàm (f) f (.SD [[ww]])), = = x "]' hoặc với 'get', như được mô tả trong câu trả lời dưới đây ... – Frank

Trả lời

6

Bạn cần sử dụng get:

> DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9) 
> ww <- sample(c("y","v"),1) 
> DT[,list(avg=mean(get(ww)),med=median(get(ww))),by="x"] 
    x  avg med 
1: a 3.333333 3 
2: b 3.333333 3 
3: c 3.333333 3 
> ww 
[1] "y" 
+0

Ah! Tôi biết nó rất đơn giản! –

+0

@ h.l.m, sẽ đẹp hơn nếu 'data.table' đưa ra thông báo lỗi mô tả hơn trong trường hợp này. – A5C1D2H2I1M1N2O1R2T1

+0

Tôi đã nghe nó chậm, nhưng '.SD [[ww]]' cũng hoạt động: 'DT [, list (avg = mean (.SD [[ww]]), med = median (.SD [[ww] ])), by = "x"] ' – Frank

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