[英]Replacing column values with null in a data frame if another column value doesn't match with the corresponding cell in another data frame in R
[英]Conditionally replacing cell values with value in another column in R
我正在处理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来获得汽车/汽车,公共汽车/公共汽车的总数非常容易。汽车和卡车/小汽车,填入适当的总数后。
任何建议将不胜感激!
如果您有更多的列,只需使用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
这是以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"))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.