【问题标题】:Filling in a data frame using else if使用 else if 填充数据框
【发布时间】:2021-05-10 13:35:25
【问题描述】:

我正在尝试使用 R 自动化流程,以便可以使用新数据快速完成。我有一个带有空标签列的数据框,根据第 1 列中值的大小,它可以有 4 个标签。

我现在有这个

testdata <- as.data.frame(document)
COL1 <- testdata$COL1
Label <- testdata$Label

for(i in 1:length(COL1)){
  if(i > 25){
    Label <- "Label 1"
  } else if(i <= 25){
    Label <- "Label 2"
  } else if(i <= 15){
    Label <- "Label 3"
  } else if (i < 7){
    Label <-" Label 4"
  }
}

我遇到的问题是整个列都填写为“标签 1”(i > 25 数据标签),无论我将它们放入哪个顺序,它们都填写为“标签 1”。

我假设 i > 25 语句有错误,但我看不到它。

谢谢

【问题讨论】:

    标签: r dataframe if-statement


    【解决方案1】:

    如果你使用 case_when 类型的函数,我认为这更清楚,它基本上是一个 if else 语句链。

    library(tidyverse)
    
    testdata %>%
     mutate(filter_col = case_when(
        COL1 <= 7  ~ "Label 4",
        COL1 <= 15 ~ "Label 3",
        COL1 <= 25 ~ "Label 2",
        COL1 > 25  ~ "Label 1",
        )
      )
    

    【讨论】:

    • 这也行得通,谢谢。我需要在 tidyverse 上做得更好,代码看起来总是那么漂亮。
    【解决方案2】:

    问题在于i 只是反映行号(顺序)而不是COL1 的值

    有几种方法可以做到这一点,但我尝试了这样的矢量化方法:

    ifelse(testdata$COL1  > 25,
           "Label 1",
           ifelse(testdata$COL1  <= 2,
                  "Label 2",
                  ifelse(testdata$COL1<= 15,
                         "Label 3",
                         ifelse(testdata$COL1 < 7,
                                "Label 4",
                                "")
                         )
                  )
           )
    

    【讨论】:

      【解决方案3】:

      也许避免使用循环会使其更安全且不易出错?

      testdata$Label[COL1 > 0] = 'Label 4'
      testdata$Label[COL1 > 6] = 'Label 3'
      testdata$Label[COL1 > 15] = 'Label 2'
      testdata$Label[COL1 > 25] = 'Label 1'
      ``
      

      【讨论】:

      • 这很好用,但是,我的目标是根据第 1 列中的值编辑额外的 if 和方程(在后面的列中),这是否可以在没有循环的情况下工作?
      • 应该是的,你可以根据需要组合不同的条件:testdata$Label[COL1 > 0 & col4 >0.2] 如果你还希望 col1 大于 0 AND col4 大于 0.2(只是一个例子)
      • 谢谢,帮了大忙!
      【解决方案4】:

      cut 是 R 的基础函数。变量(label_factorlabel_char)之间的区别在于它们的类型。

      set.seed(123)
      df <- data.frame(x = runif(30, 0, 30))
      df$label_factor <- cut(df$x, breaks = c(-Inf, 7, 15, 25, Inf), labels = paste("Label", 1:4))
      df$label_char <- as.character(df$label_factor)
      df
      #x label_factor label_char
      #1   8.627326      Label 2    Label 2
      #2  23.649154      Label 3    Label 3
      #3  12.269308      Label 2    Label 2
      #4  26.490522      Label 4    Label 4
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-30
        • 1970-01-01
        • 2015-09-03
        • 2018-09-03
        • 2019-09-30
        • 2016-09-15
        • 2021-08-14
        相关资源
        最近更新 更多