DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9)
# Desired output
rbind(cbind(id = "v", DT[x == "a", as.list(quantile(.SD, prob = c(0.05, .5, 0.95), na.rm = T)), by = x, .SDcols = c("v")]),
cbind(id = "y", DT[x == "a", as.list(quantile(.SD, prob = c(0.05, .5, 0.95), na.rm = T)), by = x, .SDcols = c("y")]),
cbind(id = "v", DT[x == "b", as.list(quantile(.SD, prob = c(0.05, .5, 0.95), na.rm = T)), by = x, .SDcols = c("v")]),
cbind(id = "y", DT[x == "b", as.list(quantile(.SD, prob = c(0.05, .5, 0.95), na.rm = T)), by = x, .SDcols = c("y")]),
cbind(id = "v", DT[x == "c", as.list(quantile(.SD, prob = c(0.05, .5, 0.95), na.rm = T)), by = x, .SDcols = c("v")]),
cbind(id = "y", DT[x == "c", as.list(quantile(.SD, prob = c(0.05, .5, 0.95), na.rm = T)), by = x, .SDcols = c("y")])
)
# id x 5% 50% 95%
# 1: v a 4.1 5 5.9
# 2: y a 1.2 3 5.7
# 3: v b 1.1 2 2.9
# 4: y b 1.2 3 5.7
# 5: v c 7.1 8 8.9
# 6: y c 1.2 3 5.7
Как мне лучше всего добиться вышеуказанного вывода на очень большом наборе данных с помощью data.table (несколько ГБ в памяти)? Я пробовал это, но это не совсем то, что я хочу
# not right, want all 3 percentiles on the same row, for x and then y:
out <- DT[ , lapply(.SD, quantile, prob = c(0.05, .5, 0.95), na.rm = T), .SDcols = c("v", "y"), keyby = "x"]
out
Тогда как я могу получить вывод, который я хочу выше, но с идентификатором, разбросанным по столбцам, чтобы он стал таблицей данных 3 x 6. например со столбцами v5%v50%v95%y5%y50%y95% с 3 строками.