尝试在 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
。
所以我在 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
。