代码之家  ›  专栏  ›  技术社区  ›  vw88

将值分类到一列中,并在R中的新列中打印它们

  •  1
  • vw88  · 技术社区  · 6 年前

    我试图根据与其他列(在本例中为ColA、ColB、ColC)的比较,对列(Value)中的值进行分类 值的类别应写在“类别”列下的相应行中。

    下面是数据帧的一个示例

    Value   ColA    ColB    ColC    Category
    0.8     0.3     0.7     1.1 
    0.1     0.2     0.7     1.3 
    0.7     0.5     0.8     1.0 
    

    下面是我想说的基本伪代码:

    if ( Value >= 0 && Value <= ColA {
        print("Bottom") in Category
    }
    else if(Value > ColA && Value <= ColB){
        print("Middle") in Category
    }
    else if(Value > ColB && Value <= ColC){
        print("Top") in Category
    }
    else(){
    }
    

    然而,我刚刚开始学习R,正在努力学习语法。在R中如何实现这一点?

    1 回复  |  直到 6 年前
        1
  •  2
  •   f.lechleitner    6 年前

    导入数据:

    df <- read.table(text = "
                     Value   ColA    ColB    ColC
                     0.8     0.3     0.7     1.1 
                     0.1     0.2     0.7     1.3 
                     0.7     0.5     0.8     1.0", header = T)
    

    现在我们可以使用一组嵌套的 ifelse -声明:

    df$Category <-
      ifelse(df$Value >= 0 & df$Value <= df$ColA, "Bottom",
        ifelse(df$Value > df$ColA & df$Value <= df$ColB, "Middle",
          ifelse(df$Value > df$ColB & df$Value <= df$ColC, "Top", NA)
        )
      )
    

    输出:

    > df
      Value ColA ColB ColC Category
    1   0.8  0.3  0.7  1.1      Top
    2   0.1  0.2  0.7  1.3   Bottom
    3   0.7  0.5  0.8  1.0   Middle
    

    从…起 ?ifelse :

    ifelse返回一个与test形状相同的值,该值由从yes或no中选择的元素填充,具体取决于test的元素是TRUE还是FALSE。

    ifelse(test, yes, no)
    

    另一种更具可读性的解决方案:

    df$Category <- NA
    
    df$Category[df$Value >= 0 & df$Value <= df$ColA] <- "Bottom"
    df$Category[df$Value > df$ColA & df$Value <= df$ColB] <- "Middle"
    df$Category[df$Value > df$ColB & df$Value <= df$ColC] <- "Top"
    
    > df
      Value ColA ColB ColC Category
    1   0.8  0.3  0.7  1.1      Top
    2   0.1  0.2  0.7  1.3   Bottom
    3   0.7  0.5  0.8  1.0   Middle