【问题标题】:Identify and change decimal places of multiple values at once一次识别和更改多个值的小数位
【发布时间】:2021-08-26 12:37:33
【问题描述】:

我有一个这样的数据集,但要大得多:

ds2
  Event                         act      me
<fct>                       <dbl>   <dbl>
1 Labour Costs YoY             2.33  0.0264
2 Unemployment Change (000's) -5.17 -0.449 
3 Unemployment Rate            8.86  0.0900
4 Jobseekers Net Change       11.3   9.57 

问题是第一个me 变量应该是2.64(所以乘以100),而第二个需要乘以10,第三个乘以100,第四个需要保持不变。这样actme 变量的十进制相同。

有没有办法让 R 自动识别并纠正这个问题?提前致谢。

复制数据集:

ds2 <- structure(list(Event = structure(2:5, .Label = c("Event", "Labour Costs YoY", 
   "Unemployment Change (000's)", "Unemployment Rate", "Jobseekers Net Change"), 
     .Names = c("", "", "", ""), class = "factor"), act = c(2.33230769230769, -5.17018867924528, 
    8.86180371352785, 11.3192307692308), me = c(0.0263725490196078, 
     -0.449056603773585, 0.0899796195652174, 9.56704545454545)), row.names = c(NA, 
     -4L), class = c("tbl_df", "tbl", "data.frame"))

【问题讨论】:

    标签: r decimal identify


    【解决方案1】:

    如果新值应该是大约相同的小数位数,您可以计算值不同的因子的对数并使用它来转换它:

    ds2$conversion = round(log(ds2$act/ds2$me,10))
    ds2$me.new = ds2$me * 10**ds2$conversion
    

    这导致data.frame:

    > ds2
                            Event       act          me conversion    me.new
    1            Labour Costs YoY  2.332308  0.02637255          2  2.637255
    2 Unemployment Change (000's) -5.170189 -0.44905660          1 -4.490566
    3           Unemployment Rate  8.861804  0.08997962          2  8.997962
    4       Jobseekers Net Change 11.319231  9.56704545          0  9.567045
    

    【讨论】:

    • 感谢@MartinWettstein 的反应。这适用于前四个,但不适用于我的总样本中的所有变量。有时conversion 是负数(这应该很容易解决),有时转换率也不正确(不知道这是从哪里来的)。
    • 如果转换为负数,它应该可以工作。这只是意味着me 必须除以 10 的效力。但这在这段代码中没有问题。有两种可能的错误来源:如果actme 的符号不同,则没有对数。如果这两个值相差大约 3 倍(或 30 或 300),则转换是不可靠的。
    • 没关系。有用!我在重写代码时出错。谢谢!
    • 但是,我刚刚注意到您刚刚指出的关于因素 3 和不同符号的问题。也许我可以拆分数据集并手动执行这些操作?
    • 您还可以通过分别计算两列的对数、四舍五入并注意差异来计算第二个转换列。如果这两个值相同,那么您很可能是正确的。如果不是,您可以手动决定。符号的问题可以很容易地通过取绝对值来修正。但是,您必须决定,例如,1.02 和 9.98 是否具有相同的小数位数,或者是否需要进行转换。
    猜你喜欢
    • 1970-01-01
    • 2018-07-17
    • 2021-10-16
    • 1970-01-01
    • 2023-03-11
    • 2012-07-12
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多