【问题标题】:Factor levels by group按组划分的因子水平
【发布时间】:2020-12-07 10:52:46
【问题描述】:

我有一个如下所示的 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

【问题讨论】:

  • 您确定想要的输出吗?我在“M:[165,180)”中只得到 2 个观察结果。
  • @sindry_baldur 不,我是手工做的,可能出错了。

标签: r syntax data.table refactoring levels


【解决方案1】:

这可能是合适的。我们最终不会使用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) 仍然只给了我三个级别。关键是要创建一个新的因子变量,每个性别三个级别(所以六个)。
【解决方案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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    相关资源
    最近更新 更多