4

我很好奇R中是否有任何开箱即用的函数可以处理这个问题。

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

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

我想将它们转换成更有用的数字,可以对其进行计算,所以它看起来像这样:

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

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

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

4

2 回答 2

3

我们可以用gsubfn'e+9'、'e+6' 替换 'B'、'M' 并转换为numeric( as.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 的建议修改

数据

v1 <- c('$1.2M', '$3.1B', 'N/A')
于 2015-11-18T06:32:16.320 回答
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
于 2015-11-18T07:00:06.823 回答