【问题标题】:Creating a variable from a condition with more than 2 arguments从具有超过 2 个参数的条件创建变量
【发布时间】: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_levelnormal

(iii) 如果wage 大于5,则wage_levelhigh

我知道我可以使用嵌套的 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",则rating2

(iii) 如果wage_level 大于"high,则rating3

我的问题是使用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 很到位。我发现在处理大量间隔中断时,将 breakslabels 作为它们自己的变量会很有帮助,通常使用 seqpaste0 创建。
  • @ndoogan 拜托,我编辑了我的问题,你能看一下吗?
  • @RicardoSaporta 请,我编辑了我的问题,请看一下?
  • @SavedByJESUS 为什么不使用原始数字变量wage 创建rating?或者,在使用它创建 rating 之前,可以将 wage_level 创建为 有序因子

标签: r conditional-statements


【解决方案1】:
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 可能是一个奇怪的选择。 p>

【讨论】:

  • 非常感谢您的回答@ndoogan。这很有帮助;但是,如果数据没有像示例中那样按递增顺序排列,我该怎么办?如果我有wage = runif(10, 1, 10)怎么办?
  • 为什么你认为这很重要?
  • @SavedByJESUS 我同意主题。试试看。它会正常工作的。
  • 非常感谢。非常感谢您的帮助!
猜你喜欢
  • 2022-01-08
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 2013-05-03
相关资源
最近更新 更多