从CSV解析货币值,转换百万和十亿的数字后缀

问题描述 投票:3回答:2

我很好奇R中是否有任何可以处理此功能的开箱即用功能。

我有一个CSV文件,我正在使用read.csv读入数据框。 CSV中的一列包含格式为的货币值

Currency
--------
$1.2M
$3.1B
N/A

我想将它们转换为可以执行计算的更多可用数字,因此它看起来像这样:

Currency
----------
1200000
3100000000
NA

我最初的想法是以某种方式将数据帧子集成3个部分,基于包含* M,* B或N / A的行。然后使用gsub替换$和M / B,然后将剩余数字乘以1000000或1000000000,最后将3个子集重新加入1个数据帧。

但是我很好奇是否有一种更简单的方法可以在R中处理这种转换。

r currency read.csv suffix
2个回答
2
投票

我们可以使用gsubfn将'B','M'替换为'e + 9','e + 6'并转换为numericas.numeric)。

is.na(v1) <- v1=='N/A'
options(scipen=999)
library(gsubfn)
as.numeric(gsubfn('([A-Z]|\\$)', list(B='e+9', M='e+6',"$"=""),v1)) 
#[1]    1200000 3100000000         NA

编辑:根据@ nicola的建议修改

data

v1 <- c('$1.2M', '$3.1B', 'N/A')

1
投票

另一种方式,是使用for-loop

x <- c("1.2M", "2.5M", "1.6B", "N/A")
x <- ifelse(x=="N/A", NA, x)
num <- as.numeric(strsplit(x, "[^0-9.]+"))

for(i in 1:length(x)) {
 if(grepl('M', x[i]))
  print(prod(num[i], 1000000))
  else
  print(prod(num[i], 100000000))
}

# [1] 1200000
# [1] 2500000
# [1] 1.6e+08
# [1] NA
© www.soinside.com 2019 - 2024. All rights reserved.