【发布时间】:2014-02-11 23:13:10
【问题描述】:
我正在使用以下函数,grp 与data.table 聚合并遇到问题。
问题是因子变量fc_x 的级别顺序在聚合后没有保持相同的顺序。
是我的功能有问题,还是这个“正常”意味着它有解释?
grp <- function(x) {
percentage = as.numeric(table(x)/length(x))
list(x = factor(levels(x)),
percentage = percentage,
label = paste0( round( as.numeric(table(x)/length(x), 0 ) * 100 ), "%")
)
}
set.seed(123)
DT <- data.table(x = rnorm(100, 100, 50), fac = factor(letters[1:10]))
DT$fc_x <- cut(DT$x, breaks = c(0, 50, 100, 10e5), right = T,
labels = c("0-50", "51-100", "+100"))
str(DT)
# Classes ‘data.table’ and 'data.frame': 100 obs. of 3 variables:
# $ x : num 90.7 59.4 18 125.4 187.7 ...
# $ fac : Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ...
# $ fc_x: Factor w/ 3 levels "0-50","51-100",..: 2 2 1 3 3 3 3 3 1 1 ...
levels(DT$fc_x)
# [1] "0-50" "51-100" "+100"
AGG <- DT[, grp(fc_x), by=fac]
levels(AGG$x)
# [1] "+100" "0-50" "51-100"
编辑
将“+100”更改为“1000”提供了类似的结果
DT <- data.table(x = rnorm(100, 100, 50), fac = factor(letters[1:10]))
DT$fc_x <- cut(DT$x, breaks = c(0, 50, 100, 10e5), right = T,
labels = c("0-50", "51-100", "1000"))
levels(DT$fc_x)
# [1] "0-50" "51-100" "1000"
AGG <- DT[, grp(fc_x), by=fac]
levels(AGG$x)
# [1] "0-50" "1000" "51-100"
在 cut() 语句中使用 ordered = TRUE 提供相同的结果
DT <- data.table(x = rnorm(100, 100, 50), fac = factor(letters[1:10]))
DT$fc_x <- cut(DT$x, breaks = c(0, 50, 100, 10e5), right = T, ordered = T,
labels = c("0-50", "51-100", "1000"))
levels(DT$fc_x)
# [1] "0-50" "51-100" "1000"
AGG <- DT[, grp(fc_x), by=fac]
levels(AGG$x)
# [1] "0-50" "1000" "51-100"
【问题讨论】:
-
1.我认为您的意思是
right=T在cut声明中。 2. 第三种可能是无意的,也就是错误。 -
1.当然。我已经修改了它,仍然得到相同的结果。
-
对,我并不是说这是问题所在,只是您在代码中有错字(这可能会改变某个数字所属的类别,但不会改变问题)。
-
对不起,也许这看起来很粗鲁。无意!
标签: r data.table aggregation