以下是我正在尝试做的简单版本。我有以下向量:
wage = 1:10 # Generate a sequence from 1 to 10
我想创建另一个向量wage_level
,以便:
(i)如果wage_level
小于"low"
,则wage
为5
wage_level
等于normal
,则(ii)wage
为5
(iii)如果wage_level
大于high
,则wage
为5
我知道我可以使用嵌套的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"
rating
等于2
,则(ii)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
向量中的值与我指定的值无关。
任何其他方法可以达到预期效果吗?
非常感谢你的帮助:))
答案 0 :(得分: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之间的值。如果你真的使用reals,那么正好寻找5可能是一个奇怪的选择。