【问题标题】:R programming - missing value where TRUE/FALSE needed : for loopR编程-需要TRUE / FALSE的缺失值:for循环
【发布时间】:2017-01-18 17:09:12
【问题描述】:

demo 是数据集的名称。 Salary.Slab 是变量的名称。 我在 for 循环中使用 if else 语句来创建存储桶。

head(demo$Salary.Slab)
[1]  5  7  1  6 NA NA

列中有一些缺失值。我知道 if 语句不适用于 NA 值,因此我使用 is.na 编写了以下代码

for( i in nrow(demo))
{
if(is.na(demo$Salary.Slab[i])){
demo$salary = "k"

}else  if(demo$Salary.Slab[i] == 1){
demo$salary = "Very Low"

}else if(demo$Salary.Slab[i] == 3) {
demo$salary = "Very Low"

}else if(demo$Salary.Slab[i] == 4){
demo$salary = "Low"

}else if(demo$Salary.Slab[i] == 5){
demo$salary = "Low"

}else if(demo$Salary.Slab[i] == 6){
demo$salary = "Low"
}
}

salary 是我创建的用于存储存储桶值的新变量(“非常低”、“低”等...)

但是当我运行上面的代码时,我得到了每一行中的所有“k”值。而我应该只在 Salary.Slab = NA 和 Salary.slab == 1 的“非常低”的地方得到“k”,依此类推。请告诉我哪里做错了。

【问题讨论】:

  • 每次都应该是demo$salary[i]而不是demo$salary
  • 您的条件很好,但是您的分配,例如 demo$salary = "k",分配了整个向量,而不是 ith 元素。正如安德烈所说,将[i] 添加到分配行。或查看ifelse 了解矢量化方法。

标签: r if-statement for-loop boolean


【解决方案1】:

这是一个更简短的解决方案:

# Vector of numbers or NAs
Salary.Slab = c( 5,  7,  1,  6, NA, NA)

# bin by threshold
ind = findInterval(Salary.Slab, c(0,4))

# deal with missing values (number of bins plus 1)
ind[is.na(ind)] = 3;

# Assign names by bin
salary = c('Very Low', 'Low', 'k')[ind]

# Here is the result:
salary

[1] "Low"      "Low"      "Very Low" "Low"      "k"        "k"       

# Combined with the original vector
cbind(Salary.Slab, salary)

     Salary.Slab salary    
[1,] "5"         "Low"     
[2,] "7"         "Low"     
[3,] "1"         "Very Low"
[4,] "6"         "Low"     
[5,] NA          "k"       
[6,] NA          "k"

【讨论】:

    【解决方案2】:

    您需要对 if/then 的结果进行子集化:

    for( i in 1:nrow(demo))
    {
      if(is.na(demo$Salary.Slab[i])){
        demo$salary[i] = "k"
    
      }else  if(demo$Salary.Slab[i] == 1){
        demo$salary[i] = "Very Low"
    
      }else if(demo$Salary.Slab[i] == 3) {
        demo$salary[i] = "Very Low"
    
      }else if(demo$Salary.Slab[i] == 4){
        demo$salary[i] = "Low"
    
      }else if(demo$Salary.Slab[i] == 5){
        demo$salary[i] = "Low"
    
      }else if(demo$Salary.Slab[i] == 6){
        demo$salary[i] = "Low"
      }
    }
    

    否则,它将为整个列分配一个值。

    【讨论】:

    • 我认为他不必明确添加有关 is.na() == TRUE 的内容。 is.na(demo$Salary.Slab[i]) 已经返回一个布尔值。
    • 仍然发生同样的事情。
    • 好吧,我运行了多次,得到了想要的结果。注意:数据集中有 7,但循环中没有 7 选项。
    • @RyanMorton - 请您清楚地向我解释一下 if/then 结果的子集你们是什么人?实际上,我只是在这里提到了一些 if else 语句,它完全相似。
    • demo$salary[i] = "k" 具有 [i] 子集的结果只是该行。
    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2015-06-28
    • 1970-01-01
    • 2019-03-07
    • 2018-07-12
    相关资源
    最近更新 更多