2017-03-22 16 views
8

Tôi muốn làm cắt giảm quantile (cắt thành n thùng với số lượng tương đương của các điểm) cho mỗi nhómquantile cắt theo nhóm trong data.table

qcut = function(x, n) { 
    quantiles = seq(0, 1, length.out = n+1) 
    cutpoints = unname(quantile(x, quantiles, na.rm = TRUE)) 
    cut(x, cutpoints, include.lowest = TRUE) 
} 

library(data.table) 
dt = data.table(A = 1:10, B = c(1,1,1,1,1,2,2,2,2,2)) 
dt[, bin := qcut(A, 3)] 
dt[, bin2 := qcut(A, 3), by = B] 

dt 
A  B bin  bin2 
1: 1 1 [1,4] [6,7.33] 
2: 2 1 [1,4] [6,7.33] 
3: 3 1 [1,4] (7.33,8.67] 
4: 4 1 [1,4] (8.67,10] 
5: 5 1 (4,7] (8.67,10] 
6: 6 2 (4,7] [6,7.33] 
7: 7 2 (4,7] [6,7.33] 
8: 8 2 (7,10] (7.33,8.67] 
9: 9 2 (7,10] (8.67,10] 
10: 10 2 (7,10] (8.67,10] 

Ở đây cắt mà không cần nhóm là đúng - dữ liệu lời nói dối trong thùng. Nhưng kết quả của nhóm là sai.

Tôi làm cách nào để khắc phục điều đó?

+2

'dt [, qcut (A, 3), bởi = B] 'làm việc mặc dù – Cath

Trả lời

8

Đây là lỗi trong việc xử lý các yếu tố. Vui lòng kiểm tra nếu nó được biết (hoặc cố định trong phiên bản phát triển) và báo cáo nó với trình theo dõi lỗi data.table nếu không.

qcut = function(x, n) { 
    quantiles = seq(0, 1, length.out = n+1) 
    cutpoints = unname(quantile(x, quantiles, na.rm = TRUE)) 
    as.character(cut(x, cutpoints, include.lowest = TRUE)) 
} 

dt[, bin2 := qcut(A, 3), by = B] 
#  A B bin  bin2 
# 1: 1 1 [1,4] [1,2.33] 
# 2: 2 1 [1,4] [1,2.33] 
# 3: 3 1 [1,4] (2.33,3.67] 
# 4: 4 1 [1,4] (3.67,5] 
# 5: 5 1 (4,7] (3.67,5] 
# 6: 6 2 (4,7] [6,7.33] 
# 7: 7 2 (4,7] [6,7.33] 
# 8: 8 2 (7,10] (7.33,8.67] 
# 9: 9 2 (7,10] (8.67,10] 
#10: 10 2 (7,10] (8.67,10] 
+5

mà không thay đổi chức năng,' dt [, BIN2: = as.character (qcut (A, 3)), bởi = B] 'cũng hoạt động và nếu cố chuyển đổi nó thành một thừa số (' dt [, bin2: = as.factor (as.character (qcut (A, 3))), bằng = B] ') sẽ ném ra một lỗi. .. – Cath

+0

Vâng, nếu bạn xác định các yếu tố cho mỗi nhóm, cột cuối cùng (kết hợp các nhóm) sẽ chỉ lấy các thuộc tính (như các cấp) từ nhóm 1, tôi nghĩ rằng https://github.com/Rdatatable/data.table/issues/ 967 – Frank

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