R在多个条件下替换变量

R在多个条件下替换变量,r,indexing,R,Indexing,我的数据组织如下: 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 fo

我的数据组织如下:

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
我试图替换给定多个条件的列中的值。两种情况:

  • 我想将
    公司==ford
    公司==nissan
    的行中的每个
    汽车总数
    替换为0。什么命令可以实现这一点

  • 如果我的约束来自不同的列怎么办?e、 g.如果我想用0替换任何
    公司的
    汽车或
    颜色的
    ==红色,该怎么办


  • 关于你的第一个问题:

        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)
    }
    

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

    假设您的数据帧被称为
    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")
    

    redcars我喜欢使用
    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]
    

    这只是标准选择
    dat$car_total[dat$company==“ford”| dat$color==“red”]感谢您的回复。是的,我是一个相对的新手。然而,我问这个问题是因为我之前尝试过你建议的确切命令,它将我整个数据集中的所有car_总值都设置为0。一个可能导致我们不同结果的小问题:我实际上在做一个条件NOT。因此,我正在尝试的代码(使我所有的值都为0)是:dat$car_total[dat$company!=“ford”| dat$color!=“red”]=0因此,只有红色的ford将保持不变<代码>!福特!红色
    相同!(福特和红色)
    哦,等等,我是个白痴。我意识到我应该使用AND而不是OR来做NOT。好的,我现在开始工作了。谢谢你的帮助@Jim-您可能必须通过
    dat$color转换变量,但这并不是正确的方法,只需使用-
    dat$car\u total[dat$company%in%c(“福特”、“日产”)]性能将是使用
    %in%
    的主要原因。使用
    a==b | a==c
    需要三个完整的O(n)操作(两个比较,一个
    )。在%c(b,c)中使用
    a%
    是在一次传递中完成的,每行可以进行一次或两次比较。在一张百万行以上的表格中,这很重要。@MaxPD-不需要人身攻击-我没有直接攻击你。我相信你是出于好意。是的,您的代码是有效的,但正如kdopen所指出的,这是不寻常的,我认为对于试图理解选择的新R用户来说是没有用的。在行上循环通常非常慢,特别是当
    ifelse
    已经矢量化时。另外,ifelse通常用于返回一系列值,而不是运行赋值。
    # 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]