【问题标题】:Assign a dataframe column a value, based on multiple conditions根据多个条件为数据框列分配一个值
【发布时间】:2019-09-28 18:34:17
【问题描述】:

我有一个如下的数据框。

price <- c(287655, 456355, 662500, 597864,876545)

House <- data.frame(price)

我需要根据多个条件为此数据集创建另一列。假设数据框的新列是 A。

我需要为新列分配一个考虑到多个条件的值。

我尝试了几种方法。但没有一个是成功的。

if(House$price < 300000) then {House$A='red'} 
if(House$price > 300000 & House$price < 500000) then {House$A='blue'} 
if(House$price > 500000) then {House$A='green'} 

我怎样才能成功。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我们可以使用cut

    transform(House, newcol = cut(price, breaks = c(-Inf, 300000, 500000, Inf),
           labels = c("red", "blue", "green")))
    #    price newcol
    #1 287655    red
    #2 456355   blue
    #3 662500  green
    #4 597864  green
    #5 876545  green
    

    请注意,if/else 不是矢量化的,它期望输入的 length 为 1。如果我们在此循环中每个元素的 length 为 1,它可以工作,但它的效率也很低,因为有ifelse 的矢量化版本if/else

    House <- transform(House, newcol = ifelse(price < 300000, "red",
                  ifelse(price > 300000 & price < 500000, "blue", "green")))
    House
    #   price newcol
    #1 287655    red
    #2 456355   blue
    #3 662500  green
    #4 597864  green
    #5 876545  green
    

    如果我们查看结果,它们都得到了相同的输出,但区别在于ifelse 语句的数量随着比较次数的增加而增加。最好使用cutfindInterval 而不是嵌套的ifelse


    ifelse 而不是 then 一起使用

    House$newcol <- NA
    for(i in seq_len(nrow(House))) {
        House$newcol[i] <- if(House$price[i] < 300000) {
               'red'
        } else if( House$price[i] > 300000 & House$price[i] < 500000) {
           'blue'
         } else 'green'
     } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-30
      • 1970-01-01
      • 2018-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      相关资源
      最近更新 更多