1

以下是我正在尝试做的简单版本。我有以下向量:

wage = 1:10 # Generate a sequence from 1 to 10

我想创建另一个向量wage_level,这样:

(i )wage_level如果"low"小于wage5

(ii )wage_level如果normal等于wage5

(iii )wage_level如果high大于wage5

我知道我可以使用嵌套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

现在,假设我想使用该向量来使用该函数wage_level创建另一个向量(rating向量) 。cut()创建rating向量的条件如下:

(i )rating如果"1"小于wage_level"low"

(ii )rating如果2等于wage_level"normal"

(iii )rating如果3大于wage_level"high

我的问题是使用该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) 我更喜欢使用实际字符串(即“低”、“正常”和“高”)而不是标签索引的方法

(ii)rating向量中的值与我指定的值无关。

还有其他方法可以达到预期的效果吗?

非常感谢您的帮助 :)

4

1 回答 1

4
wage<-1:10
cut(wage,breaks=c(0,4,5,10),include.lowest=T,labels=c("low","normal","high"))
# [1] low    low    low    low    normal high   high   high   high   high  
#Levels: low normal high

如果向量没有被订购怎么办?没有不同:

wage <- runif(10,1,10)
wage
# [1] 8.535146 4.964819 7.228050 9.150132 6.369952 8.451137 8.022293 7.621226
# [9] 1.070368 5.931904

cut(wage,breaks=c(0,4,5,10),include.lowest=T,labels=c("low","normal","high"))
# [1] high   normal high   high   high   high   high   high   low    high  

不过,请注意该normal因子适用于 4 到 5 之间的值。如果您真的在使用实数,那么精确地寻找 5 可能是一个奇怪的选择。

于 2013-04-07T19:16:43.580 回答