按组划分的因素水平
Factor levels by group
我有一个 data.table,如下所示:
library(data.table)
dt <- fread(
"Sex Height
M 180
F 179
F 162
M 181
M 165
M 178
F 172
F 160",
header = TRUE
)
我想将高度分成几组。但是,我想要男女分开的小组。下面的代码给了我三个因子水平,我想要六个。
dt[,height_f := cut(Height, breaks = c(0, 165, 180, 300), right = FALSE), by="Sex"]
> table(dt$height_f)
[0,165) [165,180) [180,300)
2 4 2
感觉应该是很简单的东西,就是不知道怎么写。
期望的输出:
> table(dt$height_f)
M:[0,165) M:[165,180) M:[180,300) F:[0,165) F:[165,180) F:[180,300)
0 3 1 2 2 0
这可能是合适的。我们最终没有使用 table
来显示输出,尽管我认为 tibble 输出可能更有用:
library(dplyr)
dt %>%
mutate(Height = cut(Height, breaks = c(0, 166, 181, 301))) %>%
group_by(Sex, Height, .drop = FALSE) %>%
summarise(n = n())
## A tibble: 6 x 3
## Groups: Sex [2]
# Sex Height n
# <chr> <fct> <int>
#1 F (0,166] 2
#2 F (166,181] 2
#3 F (181,301] 0
#4 M (0,166] 1
#5 M (166,181] 3
#6 M (181,301] 0
请注意,breaks
参数可以理解为“直到这个数字”,因此为了获得您想要的输出,我们需要将每个整数加 1(即 breaks = c(0, 166, 181, 301
)。我们还需要指定 .drop = FALSE
如果我们希望空组显示在您想要的输出中(默认为 TRUE
)。
一个data.table
解决方案:
dt[, height_cat := cut(Height, breaks = c(0, 165, 180, 300), right = FALSE)]
dt[, height_f :=
factor(
paste(Sex, height_cat, sep = ":"),
levels = dt[, CJ(Sex, height_cat, unique = TRUE)][, paste(Sex, height_cat, sep = ":")]
)]
table(dt$height_f)
# F:[0,165) F:[165,180) F:[180,300) M:[0,165) M:[165,180) M:[180,300)
# 2 2 0 0 2 2
我有一个 data.table,如下所示:
library(data.table)
dt <- fread(
"Sex Height
M 180
F 179
F 162
M 181
M 165
M 178
F 172
F 160",
header = TRUE
)
我想将高度分成几组。但是,我想要男女分开的小组。下面的代码给了我三个因子水平,我想要六个。
dt[,height_f := cut(Height, breaks = c(0, 165, 180, 300), right = FALSE), by="Sex"]
> table(dt$height_f)
[0,165) [165,180) [180,300)
2 4 2
感觉应该是很简单的东西,就是不知道怎么写。
期望的输出:
> table(dt$height_f)
M:[0,165) M:[165,180) M:[180,300) F:[0,165) F:[165,180) F:[180,300)
0 3 1 2 2 0
这可能是合适的。我们最终没有使用 table
来显示输出,尽管我认为 tibble 输出可能更有用:
library(dplyr)
dt %>%
mutate(Height = cut(Height, breaks = c(0, 166, 181, 301))) %>%
group_by(Sex, Height, .drop = FALSE) %>%
summarise(n = n())
## A tibble: 6 x 3
## Groups: Sex [2]
# Sex Height n
# <chr> <fct> <int>
#1 F (0,166] 2
#2 F (166,181] 2
#3 F (181,301] 0
#4 M (0,166] 1
#5 M (166,181] 3
#6 M (181,301] 0
请注意,breaks
参数可以理解为“直到这个数字”,因此为了获得您想要的输出,我们需要将每个整数加 1(即 breaks = c(0, 166, 181, 301
)。我们还需要指定 .drop = FALSE
如果我们希望空组显示在您想要的输出中(默认为 TRUE
)。
一个data.table
解决方案:
dt[, height_cat := cut(Height, breaks = c(0, 165, 180, 300), right = FALSE)]
dt[, height_f :=
factor(
paste(Sex, height_cat, sep = ":"),
levels = dt[, CJ(Sex, height_cat, unique = TRUE)][, paste(Sex, height_cat, sep = ":")]
)]
table(dt$height_f)
# F:[0,165) F:[165,180) F:[180,300) M:[0,165) M:[165,180) M:[180,300)
# 2 2 0 0 2 2