我有一些包含数字、空值和字符的嘈杂数据。我需要检查数字的百分比变化。
为此,我使用正则表达式来检查列中存在的 %
符号。 如果
是,则提取
数字并减去百分比变化否则
提取
数字并执行计算以获得变化。
下面是可重现的代码
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/