按组分类的因子水平

3

我有一个如下所示的数据表:

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

你确定要这个期望的输出吗?我只在“M:[165,180)”中得到了2个观测。 - s_baldur
@sindry_baldur 不,我是手动做的,可能犯了一个错误。 - Tom
2个回答

2
一个 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 

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`)。

谢谢您的回答。然而,levels(dt$Height) 仍然只给出了三个级别。我的意思是要为每个性别创建一个具有三个级别的新因子变量(因此共六个级别)。 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接