r - 创建差异列
问题描述
我有一个包含几个项目价格的数据框。
items st.price b.price s.price
item1 10.50 8.00 12.00
item2 9.00 7.50 11.50
item3 22.00 20.00 25.00
item4 19.00 17.00 22.00
item5 55.00 53.00 57.00
我想创建一个新列difference
,指示该项目的最高价格的差异,并提取其他 2 个价格的总和。
EDIT: EXPECTED OUTPUT
items st.price b.price s.price difference
item1 10.50 8.00 12.00 -6.5
item2 9.00 7.50 11.50 -5
item3 22.00 20.00 25.00 -19
item4 19.00 17.00 22.00 -14
item5 55.00 53.00 57.00 -51
解决方案
可能是,我们可以apply
用来获取max
每一行的,然后从sum
其余的中减去
df1$difference <- apply(df1[-1], 1, function(x) {
i1 <- which.max(x)
x[i1]- sum(x[-i1])})
或使用矢量化选项 withpmax
来获取max
每行replace
的值不等于 'mx' 的数字列NA
,应用rowSums
并获得 'mx' 和此输出之间的差异
mx <- do.call(pmax, df1[-1])
mx - rowSums(replace(df1[-1], df1[-1] == mx, NA), na.rm = TRUE)
#[1] -6.5 -5.0 -17.0 -14.0 -51.0
数据
df1 <- structure(list(items = c("item1", "item2", "item3", "item4",
"item5"), st.price = c(10.5, 9, 22, 19, 55), b.price = c(8, 7.5,
20, 17, 53), s.price = c(12, 11.5, 25, 22, 57)), class = "data.frame",
row.names = c(NA,
-5L))
推荐阅读
- java - 我想创建一个 bean 并在服务启动时让它活着(2 个组件的上下文)
- mysql - 如何计算多个类别中的品牌
- android - TimePicker 对话框未显示 AM PM 选择的颜色
- continuous-integration - 我可以从 Gitlab 中的未解决问题创建功能分支吗?
- python-3.x - python3函数检查参数是否是2的幂,带有while循环并且不使用数学函数
- ios - 未调用 iOS 13 UIPanGestureRecognizer 选择器
- c++ - c++17 filesystem::remove_all 带通配符路径
- r - 警告消息:29192 未能在 lubridate 中解析
- javascript - Javascript Owl 轮播,如何从 API 动态设置 autoplayTimeout 字段?
- go - ioutil.ReadAll 替代方案,只消耗数据,不复制字节数组