【问题标题】:R replace variable given multiple conditionsR在给定多个条件的情况下替换变量
【发布时间】:2016-02-03 23:53:17
【问题描述】:

我的数据组织如下:

year    company color   car_total
2000    toyota  red     873
2013    honda   red     737
2012    nissan  green   809
2002    toyota  blue    429
2000    nissan  green   861
2012    honda   red     742
2009    toyota  red     320
2010    ford    yellow  319
2000    ford    green   587
2011    nissan  blue    777
2014    ford    blue    32

我正在尝试替换给定多个条件的列中的值。两种情况:

  1. 我想将company == fordcompany == nissan 行中的每个car_total 替换为0。什么命令可以完成此操作?

  2. 如果我的约束来自不同的列怎么办?例如如果我想用 0 替换任何 company == 福特或 color == 红色的 car_total 怎么办?

【问题讨论】:

  • 感谢您的回复。是的,我是一个相对的 R 新手。但是,我问了这个问题,因为我之前尝试过你建议的确切命令,它把我整个数据集中的所有 car_total 值都变成了 0。一个可能导致我们不同结果的小问题:我实际上正在做一个有条件的不。因此,我正在尝试的代码(使我的所有值都为 0)是: dat$car_total[dat$company != "ford" | dat$color != "red"] = 0
  • 所以,只有红色福特不会动。 !ford | !red!(ford & red) 相同
  • 哦等等,我是个白痴。我意识到我应该在不使用时使用 ands 而不是 ors。好的,我现在开始工作了。感谢您的帮助!
  • @thelatemail 对于我的代码正确解决的问题,您给了我负面评价。你在搞笑吗?
  • @Jim - 您可能必须先通过 dat$color <- as.character(dat$color) 转换变量 - R 不允许您为因子分配一个不存在的值。

标签: r indexing


【解决方案1】:

正如您从 cmets 中看到的,这可以作为标准选择紧凑地完成。但有时逻辑向量会让事情变得更清晰。

假设你的数据框被称为df

redcars <- df$color == "red"
fords <- df$company == "ford"
ford_or_nissan = fords | df$company == "nissan" # or alternatively
ford_or_nissan = df$company %in% c("ford","nissan")

这为您提供了三个向量,您可以使用它们来选择所需的行

df$car_total[ford_or_nissan] <- 0
df$car_total[fords | redcars] <- 0

使用逻辑运算符,您可以构建任意复杂的选择。

【讨论】:

    【解决方案2】:

    我喜欢使用 data.table

    # Replace car total with 0 when company = ford OR company = nissan
    dt[company %in% c("ford","nissan"), car_total := 0]
    
    # Replace any car_total with 0 when company = ford OR color = red
    dt[company == "ford" | color == "red", car_total := 0]
    

    【讨论】:

      【解决方案3】:

      第一个问题:

          year<-c(2000,2013,2012,2002,2000,2012,2009,2010,2000,2011,2014)
      company<-c('toyota','honda','nissan','toyota','nissan','honda','toyota','ford','ford','nissan','ford')
      color<-c('red','red','green','blue','green','red','red','yellow','green','blue','blue')
      car_total<-as.integer(c(873,737,809,429,861,742,320,319,587,777,32))
      df<-data.frame(year,company,color,car_total)
      for (i in 1:nrow(df))
      {
      ifelse (df$company[i]=='ford', df$car_total[i]<-0, NA)
      ifelse (df$company[i]=='nissan',df$car_total[i]<-0, NA)
      }
      

      【讨论】:

      • 这真的不是办法,只需使用 - dat$car_total[dat$company %in% c("ford","nissan")] &lt;- 0 就可以了。
      • 性能将是使用%in% 的主要原因。使用 a==b | a==c 需要三个完整的 O(n) 操作(两个比较和一个 or)。使用a %in% c(b,c) 只需一次通过,每行进行一次或两次比较。在超过一百万行的表中,这很重要。
      • @MaxPD - 无需人身攻击 - 我没有直接攻击你作为一个人。我相信你是出于好意。是的,您的代码有效,但正如 kdopen 指出的那样,这是不寻常的,我认为这对尝试理解选择的新 R 用户没有用。循环遍历行通常非常慢,尤其是当 ifelse 已经被矢量化后。此外,ifelse 通常用于返回一系列值,而不是运行赋值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 2021-05-23
      • 2015-08-23
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多