首页 > 解决方案 > 创建差异列

问题描述

我有一个包含几个项目价格的数据框。

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

标签: r

解决方案


可能是,我们可以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))

推荐阅读