尝试在 R 中分配组,但它正在填充 NA 值并丢失属于该组的其他值

Trying to assign groups in R, but it is filling in NA values and missing others that belong in the group

所以我在 R 中有一个数据集(弗雷明汉心脏研究数据),我正在尝试分配 BMI 组 "underweight," "normal," "overweight," 和 "obese."

它有超过 11,000 个观察值和 38 个 variables/columns,因此 post 此处的一些数据有点困难(我希望如果没有它)。

数据集称为 frm,我正在尝试按以下方式进行子集化:

frm$BMIGRP <- NA  #Creating new variable (this part works and creates a BMIGRP column with all NA values)
frm$BMIGRP[which(as.numeric(frm$BMI) < 18.5)] <- "underweight"

但是,数据集BMI变量中有NA值(用“.”表示,我也试过改成NA)。

当我尝试以这种方式对每个组进行子集化时,它仅将一些权重不足的值分配给 "underweight" 并分配了大量的 NA /“。”价值也被减持。然后它告诉我只有 10 "normal" 个体重受试者和大约 11000 个属于肥胖类别,这是不正确的,因为我可以查看数据集。

如果操作正确,这应该会创建四个组,每个类别中包含数百到数千个观察值。但我只有 10 个正常,71 个体重不足,约 11,000 个肥胖。

我只是不确定我哪里出了问题,或者是否有不同的方法可以创建一个新变量并以相同的方式分配它。非常感谢任何帮助。

我还应该提到,这是我的教授在我们的实验室课程中作为示例给我们的代码,我基本上是复制并粘贴它,并为我的数据集进行适当的替换。

这是我在本网站上的第一个问题,如果问题不完整或需要提供更多信息,我深表歉意。谢谢!

阅读你的代码,该列似乎不是数字。

这应该有效:

frm$BMI <- as.numeric(frm$BMI)
frm$BMIGRP[frm$BMI < 18.5] <- "underweight"

就像@leeum 说的。检查 BMI 是否为数字。如果要基于 BMI 创建新的类别列,请查看 dplyr 中的 case_when。所以也许这就是您想要的:

library(dplyr)

frm <- frm %>% 
  mutate(BMI = as.numeric(BMI)) %>%
  mutate(BMIGRP = case_when(
    BMI < 18.5 ~ 'underweight',
    between(BMI, 18.5, 24.9)  ~ 'healthy weight',
    between(BMI, 25, 29.9) ~ 'overweight',
    BMI > 30 ~ 'obese')
  )

mutate(BMIGRP = as.numeric(BMIGRP))BMIGRP 列转换为数字。然后 mutate(BMIGRP = case_when(...) 将创建一个名为 BMIGRP 的新列,并根据 BMI 分配 'underweight'、'healthy weight'、'overweight' 或 'obese' ].如果参数不适用,将分配 NA