【问题标题】:r: conditionally replace values in a subset of columnsr:有条件地替换列子集中的值
【发布时间】:2016-11-29 05:38:12
【问题描述】:

我有一个这样的数据框:

sport   contract start contract end visits spends purchases
basket   2013-10-01     2014-10-01   12      14      23
basket   2014-02-12     2015-03-03   23      11      7
football 2015-02-12     2016-03-03   23      11      7
basket   2016-07-17     2013-09-09   12       7      13

我想根据变量“sport”和“contract start”有条件地将列 [4:6] 替换为 NA。 比如:

i1 <- which(df$sport =="basket" & df$contract_start>="2014-01-01")

将索引满足我的条件的所有行。 是否有一段简单的代码可以添加到上面,在上述条件下将 df[4:6] 替换为 NAs? 我想以这样的方式结束:

sport   contract start contract end visits spends purchases
basket   2013-10-01     2014-10-01   12      14      23
basket   2014-02-12     2015-03-03   NA      NA      NA
football 2015-02-12     2016-03-03   23      11      7
basket   2016-07-17     2013-09-09   NA      NA      NA

谢谢! A.

【问题讨论】:

    标签: r replace conditional


    【解决方案1】:

    您可以简单地指定您想用 NA 替换的行和列,并将NA 分配给它:

    df[df$sport =="basket" & df$contract_start>="2014-01-01", 4:6] <- NA
    
    df
    #      sport contract_start contract_end visits spends purchases
    # 1   basket     2013-10-01   2014-10-01     12     14        23
    # 2   basket     2014-02-12   2015-03-03     NA     NA        NA
    # 3 football     2015-02-12   2016-03-03     23     11         7
    # 4   basket     2016-07-17   2013-09-09     NA     NA        NA
    

    【讨论】:

    • 谢谢,正是我想要的。
    【解决方案2】:
    library("data.table")
    setDT(df)
    df[i = sport == "basket" & contract_start >= "2014-01-01", 
       j = c("visits", "spends", "purchases") := NA]
    
    > df
          sport contract_start contract_end visits spends purchases
    1:   basket     2013-10-01   2014-10-01     12     14        23
    2:   basket     2014-02-12   2015-03-03     NA     NA        NA
    3: football     2015-02-12   2016-03-03     23     11         7
    4:   basket     2016-07-17   2013-09-09     NA     NA        NA
    

    使用 my_cols 变量的上述代码的变体:

    my_cols <- names(df)[4:6]
    df[i = sport == "basket" & contract_start >= "2014-01-01", 
       j = (my_cols) := .(NA)]
    

    【讨论】:

      猜你喜欢
      • 2015-02-01
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 2018-11-07
      相关资源
      最近更新 更多