2017-07-06 19 views
9

Vẫn đang học R, nhưng cá nhân tôi đã chấp nhận rằng điều này là không thể, và tôi hy vọng một trong các bạn có thể chứng minh tôi sai.Có nghĩa là trên các tập hợp con của một tập hợp con

Tôi đang tìm giá trị trung bình cho các giá trị < = phần trăm thứ 25 và giá trị trung bình của các giá trị> = 75 phần trăm; nhưng không phải cho toàn bộ tập dữ liệu. Tôi muốn tìm các phương tiện này cho các tập con dữ liệu, từ đó các phần trăm được tìm thấy.

này sẽ tạo ra dữ liệu tương tự như của riêng tôi:

library(data.table) 
DT <- data.table(V1 <- c('AR','AR','AR','AR','AR','AR','AD','AD','AD','AD','AD','AD','BD', 
         'BD','BD','BD','BX','CX','DX','DX','DD','DD','DD','DD','DR','DR', 
         'DR','DR','DR','DR'), 
       V2 <- c(.12,.02,.03,.22,.44,.09,.11,.17,.15,.26,.29,.27,.16,.16,.02,.12,.02, 
         .03,.22,.44,.09,.11,.17,.15,.26,.29,.27,.16,.16,.02)) 

Hình như:

V1 V2 
1: AR 0.12 
2: AR 0.02 
3: AR 0.03 
4: AR 0.22 
5: AR 0.44 
6: AR 0.09 
7: AD 0.11 
8: AD 0.17 
9: AD 0.15 
10: AD 0.26 
11: AD 0.29 
12: AD 0.27 
13: BD 0.16 
14: BD 0.16 
15: BD 0.02 
16: BD 0.12 
17: BX 0.02 
18: CX 0.03 
19: DX 0.22 
20: DX 0.44 
21: DD 0.09 
22: DD 0.11 
23: DD 0.17 
24: DD 0.15 
25: DR 0.26 
26: DR 0.29 
27: DR 0.27 
28: DR 0.16 
29: DR 0.16 
30: DR 0.02 

Bước đầu tiên: trung bình Calulate, 25 phần trăm, phần trăm thứ 75, và đếm sự xuất hiện của mỗi A_, B_ , C_, D_. Đã nhận nó:

dt.qtile <- DT[, list(Bottom = quantile(V2, .25), 
         Middle = quantile(V2, .5), 
         Top = quantile(V2, .75), 
       Appearances = .N), by = V1] 

Tạo:

V1 Bottom Middle Top Appearances 
1: AR 0.045 0.105 0.1950   6 
2: AD 0.155 0.215 0.2675   6 
3: BD 0.095 0.140 0.1600   4 
4: BX 0.020 0.020 0.0200   1 
5: CX 0.030 0.030 0.0300   1 
6: DX 0.275 0.330 0.3850   2 
7: DD 0.105 0.130 0.1550   4 
8: DR 0.160 0.210 0.2675   6 

Đây là nơi tôi nghĩ rằng đó là điều không thể. Tôi muốn tìm các giá trị trong V2 ban đầu (DT $ V2) nhỏ hơn hoặc bằng giá trị của phân vị thứ 25, sau đó lớn hơn hoặc bằng phần trăm thứ 75 cho mỗi kết hợp chữ cái trong V1.

V1 V2 
1: AR 0.12 - Ignore - 
2: AR 0.02 <= 0.045 \ 
3: AR 0.03 <= 0.045 /mean = 0.05 (Bottom) 
4: AR 0.22 >= 0.1950 \ 
5: AR 0.44 >= 0.1950 /mean = 0.33 (Top) 
6: AR 0.09 - Ignore - 
    ------ 
7: AD 0.11 <= 0.155 > mean = 0.11 (Bottom) 
8: AD 0.17 - Ignore - 
9: AD 0.15 - Ignore - 
10: AD 0.26 >= 0.2675 \ 
11: AD 0.29 >= 0.2675 | mean = 0.2733 (Top) 
12: AD 0.27 >= 0.2675 /
     ... 
25: DR 0.26 - Ignore - 
26: DR 0.29 >= 0.2675 \ 
27: DR 0.27 >= 0.2675 /mean = 0.28 (Top) 
28: DR 0.16 <= 0.16 \ 
29: DR 0.16 <= 0.16  | mean = 0.17 (Bottom) 
30: DR 0.02 <= 0.16 /

Giá trị trung bình trong V2 là < = 25 phần trăm, sau đó là giá trị trung bình> = 75 phần trăm.

Sản lượng mới nên một cái gì đó như thế này:

V1 Bottom Middle Top Appearances 
1: AR 0.025 0.105 0.3300   6 
2: AD 0.110 0.215 0.2733   6 
        ... 
8: DR 0.170 0.210 0.2800   6 

này được tôi gần:

DT[V2 < quantile(V2, .25), mean(V2), by = V1] 

Nhưng nó tính toán quantile cho tập dữ liệu toàn, không từng tổ hợp ký tự.

Vì vậy, tôi cố gắng:

DT[V2 < DT[, quantile(V2, .25), by = V1], mean(V2), by = V1] 

tôi có được điều này:

Error in `[.data.table`(DT, V2 < DT[, quantile(V2, 0.25), by = V1], mean(V2), : 
    i is invalid type (matrix). 
Perhaps in future a 2 column matrix could return a list of elements of DT 
(in the spirit of A[B] in FAQ 2.14). 
Please let datatable-help know if you'd like this, or add your comments to FR #657. 

Tôi biết điều này có phải là đơn giản, nhưng tôi chỉ không thể nhìn thấy nó. Tôi đang thiếu gì? Hãy cho tôi biết nơi tôi có thể làm rõ.

Tôi đánh giá cao sự trợ giúp của bạn trước!

EDIT

DT[, list(Bottom = mean(V2[V2 <= quantile(V2, 0.25)]), 
      Middle = median(V2), 
       Top = mean(V2[V2 >= quantile(V2, 0.75)]), 
     Appearances = .N), by = V1] 

tôi sẽ không bao giờ đã thấy điều này một mình.

Trả lời

1
DT[, mean(V2[V2 < quantile(V2, 0.25)]), by = V1] 
    V1 V1 
1: AR 0.025 
2: AD 0.130 
3: BD 0.020 
4: BX NaN 
5: CX NaN 
6: DX 0.220 
7: DD 0.090 
8: DR 0.020 

DT[, mean(V2[V2 > quantile(V2, 0.75)]), by = V1] 
    V1 V1 
1: AR 0.33 
2: AD 0.28 
3: BD NaN 
4: BX NaN 
5: CX NaN 
6: DX 0.44 
7: DD 0.17 
8: DR 0.28 
+0

Trong các phần bạn đã đề cập bạn muốn '<=' và trong các phần khác bạn đang sử dụng '<'. Rõ ràng là '<' and '> 'và được đổi chỗ cho' <=' and '> = 'nếu cần. –

+0

Ban phước cho bạn, thưa bạn. Tôi đã chạy mã một thời gian hoặc hai, và tôi sẽ cung cấp cho nó một shot trên dữ liệu của tôi. Tôi sẽ báo cáo lại với kết quả! – Jake

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