0

这应该相当容易,但我只是让自己感到困惑。带数据框:

df <- data.frame(id = 1:5, rate1 = c(1, 0, 0.3, 0.5, 1)
, rate2 = c(0, 0.6, 1, 0, 1), cost1 = 3:7, cost2 = 8:4)

我想根据是否等于 1 添加一个新列,rate1然后rate2用最大值填充新列,cost1否则cost2使用 0。所需的结果将是:

  id rate1 rate2 cost1 cost2 overspent
1  1   1.0   0.0     3     8         8
2  2   0.0   0.6     4     7         0
3  3   0.3   1.0     5     6         6
4  4   0.5   0.0     6     5         0
5  5   1.0   1.0     7     4         7

我假设使用类似于:

df$overspent <- with(df, ifelse((rate1 == 1 || rate2 == 1)
                     , apply(cbind(cost1, cost2), 1, max), 0))

但显然它不起作用。请纠正我。谢谢!

4

1 回答 1

2

你需要使用|,而不是||。但是看看这如何更优雅:

transform(df, overspent = ifelse(rate1 == 1 | rate2 == 1,
                                 pmax(cost1, cost2), 0))

此外,正如@Ferdinand.kraft 指出的那样,比较数字可能是危险的(虽然在这个例子中没有)所以你可能想用以下内容替换rate1 == 1

abs(rate1 - 1) < .Machine$double.eps ^ 0.5

或者

sapply(rate1 - 1, function(x)isTRUE(all.equal(x, 0)))
于 2013-05-31T00:19:29.713 回答