【问题标题】:Conditionally change column value based on value in another column根据另一列中的值有条件地更改列值
【发布时间】:2017-12-22 08:17:07
【问题描述】:

我在 R 中有一个数据集,其结构如下:

> head(top10_master, n = 5)
   sensitivity      PRODUCT NewRevenue NewQuantity NewProfit Change_Price Rev_Change Prof_Change Quant_Change Revenue Quantity  Profit
1:           1 PRODUCT33411    7067750    11809634   5790148      0.80000  1.2282115    1.173265    1.5591315 5754505  7574495 4935074
2:           1 PRODUCT35481    4484178     5721789   3278738      1.04978  1.0000000    1.000000    1.0000000 4484178  5721789 3278738
3:           1 PRODUCT26835    5239519     2239783   3950871      0.90000  1.1801825    1.125136    1.3884444 4439584  1613160 3511460
4:           1 PRODUCT33203    5872765     1139270   3125781      0.90000  1.3477930    1.161484    1.6487265 4357320   691000 2691195
5:           1 PRODUCT22426    4125707     1121494   3249458      0.80000  0.9590297    1.378040    0.4507613 4301960  2488000 2358029

我正在尝试在 Rev_Change and Quant_Change columns == 1.我已经尝试了所有我能找到的方法,包括使用dplyr,但由于某种原因,这些方法都不起作用,并且输出总是相同的。请帮忙。

我尝试了太多方法来列出所有方法,但其中包括in this post 列出的所有方法。出于某种原因,这些方法都不起作用。

【问题讨论】:

  • 可能是浮点精度的情况
  • @akrun 我怀疑您可能是对的,因为似乎传统的子集无法识别 Change_Rev = 1 等...我该如何解决?

标签: r function conditional


【解决方案1】:

正如 akrun 建议的那样,也许有一个 floating point accuracy issue。您可以尝试使用 dplyr 的near

这是比较两个浮点数向量是否(成对)相等的安全方法。这比使用 == 更安全,因为它具有内置的容差。

这可能对你有用:

library(dplyr)
top10_master$Change_Price[which(near(top10_master$Rev_Change, 1) & near(top10_master$Quant_Change, 1))] <- 1

【讨论】:

  • 这个解决方案的唯一问题是它似乎也舍入了其他值
  • @zsad512 我不完全理解您的问题。可以举个例子吗?
【解决方案2】:
top10_master$Change_Price[sapply(top10_master$Rev_Change, all.equal, 1) & sapply(top10_master$Quant_Change, all.equal, 1)] <- 1

子集到要更改的数据,然后分配。

【讨论】:

  • 正如我的帖子@troh 中提到的,我已经尝试过了,但它没有用
  • @zsad512 我已经根据上面的评论更新了我的答案。
  • Error in sapply(inData$Change_Rev, all.equal, 1) &amp; sapply(inData$Change_Quant, : operations are possible only for numeric, logical or complex types
  • 我在发布 ^ 之前也检查了输入数据表,它们都被列为 numeric 所以不太确定这里发生了什么......
  • 我假设你使用过:is.numeric(inData$Change_Rev); is.numeric(inData$Change_Quant)
猜你喜欢
  • 2018-10-16
  • 2020-08-20
  • 2021-09-03
  • 2012-11-06
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
相关资源
最近更新 更多