r - if循环计算所有记录

标签 r

我有一些包含数字、空值和字符的嘈杂数据。我需要检查数字的百分比变化。 为此,我使用正则表达式来检查列中存在的 % 符号。 如果是,则提取数字并减去百分比变化否则 提取数字并执行计算以获得变化。

下面是可重现的代码

df = data.frame(Actual = c('0.10%','55.10%',NA,'20.8B'),
                 Previous = c('-0.50%','47.90%',NA,'16.6B'))
df

  Actual Previous
1  0.10%   -0.50%
2 55.10%   47.90%
3   <NA    <NA>
4  20.8B    16.6B

# if loop to calculate percentage change
if(grepl("%", df$Actual) & grepl("%", df$Previous)) {
   a = as.numeric(stringr::str_extract(df$Actual,"[-\\d.][\\d]"))
   p = as.numeric(stringr::str_extract(df$Previous,"[-\\d.][\\d]"))
   df$Gain = a - p
 } else {
   a = as.numeric(stringr::str_extract(df$Actual,"[-\\d.][\\d]"))
   p = as.numeric(stringr::str_extract(df$Previous,"[-\\d.][\\d]"))
   df$Gain = (a - p)/p * 100
 }

df

  Actual Previous Gain
1  0.10%   -0.50%  0.6
2 55.10%   47.90%  7.2
3   <NA>    <NA>   <NA>
4  20.8B    16.6B  4.2

最后一个值应计算为 25.30,而不是 4.2 if 循环的值为:

grepl("%", df$Actual) & grepl("%", df$Previous)
[1]  TRUE  TRUE FALSE FALSE

最后一行应该在 else 循环中。你能帮忙纠正一下代码中的错误吗?

最佳答案

您可以将 readr 包(tidyverse 包之一)中的 parse_number 函数与 结合使用>ifelse 条件来实现你想要的。

使用:

library(readr)
library(dplyr)

df %>% 
  mutate(gain = (parse_number(Actual) - parse_number(Previous)) / 
           if_else(grepl('%', Actual), 1, parse_number(Previous)/100) )

给出:

  Actual Previous    gain
1  0.10%   -0.50%  0.6000
2 55.10%   47.90%  7.2000
3   <NA>     <NA>      NA
4  20.8B    16.6B 25.3012

关于r - if循环计算所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47906554/

相关文章:

r - 总结并列出dplyr中的自定义索引

R Shiny : Refactoring code

r - 使用 stargazer 进行生活并出现错误

在 R session 中删除/分离包

r - 与一个 data.table 中的多个组互相关

r - 如何在 CentOS 6.8 安装 sf R 的包或 GDAL

r - Mutate_at ,通过指定列名添加列

r - 如何合并 2 个数据框?

r - 带状图中按组的点颜色 (col) 和填充颜色 (bg)

r - 用ggplot2绘制粗体字母?