【发布时间】:2013-04-07 19:04:47
【问题描述】:
以下是我正在尝试做的简单版本。我有以下向量:
wage = 1:10 # Generate a sequence from 1 to 10
我想创建另一个向量wage_level 这样:
(i) 如果wage 小于5,则wage_level 是"low"
(ii) 如果wage 等于5,则wage_level 是normal
(iii) 如果wage 大于5,则wage_level 为high
我知道我可以使用嵌套的 ifelse 语句来做到这一点,但是,正如我之前指出的,这只是我真正想做的事情的简化版本,因为我有大约 15 种替代方案。
编辑
下面提供的答案使用了cut() 函数,该函数实际上在许多情况下都很好用。但是,就我而言,它似乎不起作用。以下是详细说明。
我能够使用cut() 函数创建wage_level 向量:
wage = runif(10, 1, 10) # Randomly generate 10 values between 1 and 10
# Here I use the cut() function
wage_level = cut(wage,
breaks = c(1, 4, 6, 10),
labels = c("low", "normal", "high"),
include.lowest = TRUE)
> wage
[1] 5.522422 4.793292 8.161671 5.480415 1.396909 3.403013 4.940242 7.762142 6.364159 4.603998
> wage_level
[1] normal normal high normal low low normal high high normal
Levels: low normal high
现在,假设我想通过 cut() 函数使用 wage_level 向量创建另一个向量(rating 向量)。 rating向量的创建条件如下:
(i) 如果wage_level 小于"low",则rating 是"1"
(ii) 如果wage_level 等于"normal",则rating 是2
(iii) 如果wage_level 大于"high,则rating 为3
我的问题是使用cut() 函数不会使rating 向量成为numeric 向量将成为我选择的值。以下代码不起作用:
rating = cut(as.numeric(wage_level),
breaks = c(0, 1, 2, 3),
labels = c(1.2, 6.5, 8.9),
include.lowest = TRUE)
> as.numeric(rating)
[1] 2 2 3 2 1 1 2 3 3 2
我这里主要有两个问题:
(i) 我更喜欢使用实际字符串(即“low”、“normal”和“high”)而不是标签索引
(ii) rating 向量中的值与我指定的值无关。
还有其他方法可以达到预期的效果吗?
非常感谢您的帮助:)
【问题讨论】:
-
您可能正在寻找
cut() -
@ndoogan 很到位。我发现在处理大量间隔中断时,将
breaks和labels作为它们自己的变量会很有帮助,通常使用seq和paste0创建。 -
@ndoogan 拜托,我编辑了我的问题,你能看一下吗?
-
@RicardoSaporta 请,我编辑了我的问题,请看一下?
-
@SavedByJESUS 为什么不使用原始数字变量
wage创建rating?或者,在使用它创建rating之前,可以将wage_level创建为 有序因子。