【发布时间】:2016-02-16 14:03:59
【问题描述】:
假设以下数据集:
+---------------+------------+---------- + |航空公司 |销售总额 |出发前几天 | +---------------+------------+---------- + |吉隆坡 | 477.99 | 0 | |自动对焦 | 457.99 | 0 | |平方 | 556.31 | 0 | +---------------+------------+---------- +我想做的是:
- 将列中的值与同一列中的所有其他值进行比较。
- saleTotal(1) 是否小于 saleTotal(2) 和 saleTotal(3) 的值
- 如果是,多少? saleTotal(3)/saleTotal(1)
工单:
- 477,99
- 477,99 (556.31/477.99)-1=1.16(增加 16%)
- 457.99 .....
- 457.99 .....
- 556.31
- 556.31
到目前为止我所做的尝试:
cal <- apply(df_matrix[1:2,2], 1, function(x) {
A <- x
x <- x[-1]
ifelse(x>A, 1, ifelse(x<A, 0, NA))
})
cal
这没有成功并打印出“logical(0)”,所以我猜没有结果。 我尝试了很多方法,使用 lapply、mapply,但似乎都是比较静态数字而不是前几行。
我从 apply 中了解到的是,每个 X 都有其“迭代”的行。这就是为什么我尝试比较 X>A 而 A 是具有所有 saleTotal 值的整个向量的原因。因此,遍历每一个。
预期输出 业务产出:“价格比 XY 其他价格便宜”
我想这将是避免大矩阵和尽可能低内存的最佳方法) 有没有办法直接“nrow()”结果而不是先创建矩阵/列表?
+------------+-------------+ |销售总额 |比 | 便宜 +------------+-------------+ | 477.99 | 1 | | 457.99 | 2 | | 556.31 | 0 | +------------+-------------+知道怎么做吗?性能怎么样,我有 100000+ 行?
编辑:预期输出(一种方式)
【问题讨论】:
-
看看
outer(df$saleTotal, df$saleTotal, "/")值大于 1 表示增加,小于 1 表示减少,矩阵的对角线全为 1,因为它将每个值与自身进行比较。 -
想要的输出到底是什么?给出
FALSE的<比较会发生什么?您的“工作订单”表示一个简单的循环,例如lapply(seq_along(x), function(i) x[-i][x[[i]] < x[-i]] / x[[i]]) -
@s1x 显示示例输入的预期输出...
-
看来你需要
findInterval;length(x) - findInterval(x, sort(x))应该足够高效。 -
@alexis_laz 您应该将此作为答案发布,(如果有人好奇地对我认为很棒的解决方案进行基准测试(我认为
findInterval会更快);p)跨度>
标签: r