变量的子选择
Subselection of a variable
我在选择应包含特定范围值的变量时遇到问题。我想将我的变量分成 3 类。即; small
、medium
和 big
。一段上下文。我有一个名为 obj_hid_woonopp
的变量(大小以 m2 为单位),范围为 16-375。我的数据集叫做 datalogitvar
.
抱歉,我没有可重现的代码。但由于我认为这是一个相当简单的问题,我希望它仍然可以得到回答。我使用的代码如下
datalogitvar$size_small<- as.numeric(obj_hid_WOONOPP>="15" & obj_hid_WOONOPP<="75" )
datalogitvar$size_medium<- as.numeric(obj_hid_WOONOPP>="76" & obj_hid_WOONOPP<="100" )
datalogitvar$size_large<- as.numeric(obj_hid_WOONOPP>="101")
当我 运行 这样做时,我确实得到了一个结果。只是不是我希望的结果。例如,小类别也包含非常多的数字。似乎(因为我定义了 "75"
)它也采用 "175"
的值,因为它包含 "75"
。我一直在考虑它,我觉得它将我的数据读取为文本而不是数字。但是我确实说 as.numeric
所以我有点困惑。有人可以向我解释我如何确保创建具有适当范围的这 3 个变量吗?我觉得我很接近,但到目前为止结果毫无用处。
非常感谢您的帮助。
对于这样的问题,您可以使用 mtcars 等公开数据集复制您的问题。
关于你的代码
1) 您需要在代码右侧将数据集命名为 DATASET$obj_hid_WOONOPP。
2) 为什么要在数值周围使用引号?这些引号防止数字被视为数字。它们被视为字符串值。
我想你想使用类似于我在下面编写的代码的东西。
mtcars$mpg_small <- as.numeric(mtcars$mpg >= 15 & mtcars$mpg <= 20)
mtcars$mpg_medium <- as.numeric(mtcars$mpg > 20 & mtcars$mpg <= 25)
mtcars$mpg_large <- as.numeric(mtcars$mpg > 25)
只是为了说明你的问题:
a <- "75"
b <- "175"
a > b
TRUE (75 > 175)
a < b
FALSE (75 < 175)
字符串不会像您期望的那样进行比较。
我想到了两个想法,但代码示例会有所帮助。
首先,查看 cut()
的文档,它可用于根据您设置的分割点将数值向量转换为因子。
其次,正如@MrFlick 指出的那样,您的代码可以重写,以便 as.numeric()
在包含要转换为数值的字符串的字符向量上 运行 然后执行布尔比较,例如作为 >
或 &
.
以@Joe 为基础
mtcars$mpg_small <- (as.numeric(mtcars$mpg) >= 15 &
(as.numeric(mtcars$mpg) <= 20))
还要小心,如果您的字符串向量 obj_hid_WOONOPP
包含一些无法强制转换为数字的值,它们将变为 NA
。
我在选择应包含特定范围值的变量时遇到问题。我想将我的变量分成 3 类。即; small
、medium
和 big
。一段上下文。我有一个名为 obj_hid_woonopp
的变量(大小以 m2 为单位),范围为 16-375。我的数据集叫做 datalogitvar
.
抱歉,我没有可重现的代码。但由于我认为这是一个相当简单的问题,我希望它仍然可以得到回答。我使用的代码如下
datalogitvar$size_small<- as.numeric(obj_hid_WOONOPP>="15" & obj_hid_WOONOPP<="75" )
datalogitvar$size_medium<- as.numeric(obj_hid_WOONOPP>="76" & obj_hid_WOONOPP<="100" )
datalogitvar$size_large<- as.numeric(obj_hid_WOONOPP>="101")
当我 运行 这样做时,我确实得到了一个结果。只是不是我希望的结果。例如,小类别也包含非常多的数字。似乎(因为我定义了 "75"
)它也采用 "175"
的值,因为它包含 "75"
。我一直在考虑它,我觉得它将我的数据读取为文本而不是数字。但是我确实说 as.numeric
所以我有点困惑。有人可以向我解释我如何确保创建具有适当范围的这 3 个变量吗?我觉得我很接近,但到目前为止结果毫无用处。
非常感谢您的帮助。
对于这样的问题,您可以使用 mtcars 等公开数据集复制您的问题。
关于你的代码 1) 您需要在代码右侧将数据集命名为 DATASET$obj_hid_WOONOPP。 2) 为什么要在数值周围使用引号?这些引号防止数字被视为数字。它们被视为字符串值。
我想你想使用类似于我在下面编写的代码的东西。
mtcars$mpg_small <- as.numeric(mtcars$mpg >= 15 & mtcars$mpg <= 20)
mtcars$mpg_medium <- as.numeric(mtcars$mpg > 20 & mtcars$mpg <= 25)
mtcars$mpg_large <- as.numeric(mtcars$mpg > 25)
只是为了说明你的问题:
a <- "75"
b <- "175"
a > b
TRUE (75 > 175)
a < b
FALSE (75 < 175)
字符串不会像您期望的那样进行比较。
我想到了两个想法,但代码示例会有所帮助。
首先,查看 cut()
的文档,它可用于根据您设置的分割点将数值向量转换为因子。
其次,正如@MrFlick 指出的那样,您的代码可以重写,以便 as.numeric()
在包含要转换为数值的字符串的字符向量上 运行 然后执行布尔比较,例如作为 >
或 &
.
以@Joe 为基础
mtcars$mpg_small <- (as.numeric(mtcars$mpg) >= 15 &
(as.numeric(mtcars$mpg) <= 20))
还要小心,如果您的字符串向量 obj_hid_WOONOPP
包含一些无法强制转换为数字的值,它们将变为 NA
。