【问题标题】:Conditionally replacing cell values with value in another column in R有条件地将单元格值替换为 R 中另一列中的值
【发布时间】:2019-12-04 22:39:38
【问题描述】:

我正在处理 R 中的一个大型碰撞数据集,其中每一行代表一个唯一的汽车碰撞 (ID)。每次碰撞都会产生相关的死亡总数。我还有代表发生碰撞的汽车组合的列(汽车/汽车、公共汽车/汽车、卡车/汽车)。每次碰撞只能有一个编码为 1 的车辆组合。

这是我的数据集的迷你版:

ID fatalities car/car bus/car truck/car
1     2        0        1       0
2     3        1        0       0
3     1        0        1       0

我想用死亡总数替换碰撞中车辆的 1/0 编码。我最终想按事故类型汇总死亡人数。

这是我希望我的数据集的样子:

ID fatalities car/car bus/car truck/car
1     2        0        2       0
2     3        3        0       0
3     1        0        1       0  

我可以使用 ifelse 语句,但是在我的真实数据集中,这将是非常乏味的,因为有 42 个不同的可能参与方参与碰撞而不是 3 个。我认为使用 colsum 来获取 car/car 的总数会很容易、公共汽车/汽车和卡车/汽车,一旦填写适当的总数。

任何建议将不胜感激!

【问题讨论】:

    标签: r replace conditional-statements multiple-columns


    【解决方案1】:

    如果您有更多列,只需使用colnames(df) 获取列名并将列名提供给.vars 参数。

    library(dplyr)
    
    df <- tribble(
        ~crash_Id, ~fatalities, ~`car/car`,~`bus/car`,~`truck/car`,
        1,2,0,1,0,
        2,3,1,0,0,
        3,1,0,1,0
    )
    
    
    out <- mutate_at(.tbl = df,
              .vars = c("car/car","bus/car","truck/car"),
              .funs = ~ . * fatalities) 
    
    > out 
    # A tibble: 3 x 5
      crash_Id fatalities `car/car` `bus/car` `truck/car`
         <dbl>      <dbl>     <dbl>     <dbl>       <dbl>
    1        1          2         0         2           0
    2        2          3         3         0           0
    3        3          1         0         1           0
    

    【讨论】:

    • 这正是我想要的!该代码完美运行。谢谢!
    【解决方案2】:

    这是基础 R 中的一种方式 -

    df[-1] <- lapply(df[-1], function(x) x * df$fatalities)
    result <- rbind(df, TOTAL = colSums(df))
    
            fatalities car.car bus.car truck.car
    crash 1          2       0       2         0
    crash 2          3       3       0         0
    crash 3          1       0       1         0
    TOTAL            6       3       3         0
    

    注意:我不建议您像这样构建数据进行分析。如果您这样做是为了将结果导出到文件或其他东西,那就没问题了。

    数据 -

    df <- structure(list(fatalities = c(2L, 3L, 1L), car.car = c(0L, 1L, 
    0L), bus.car = c(1L, 0L, 1L), truck.car = c(0L, 0L, 0L)), .Names = c("fatalities", 
    "car.car", "bus.car", "truck.car"), class = "data.frame", row.names = c("crash 1", 
    "crash 2", "crash 3"))
    

    【讨论】:

    • 感谢您的反馈!是的,这种结构不适合分析。正如您所提到的,这更像是导出的最后一步。
    猜你喜欢
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2018-10-18
    • 1970-01-01
    • 2015-02-17
    • 2016-11-29
    相关资源
    最近更新 更多