Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 从CSV解析货币值,转换百万和十亿的数字后缀_R_Currency_Read.csv_Suffix - Fatal编程技术网

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

R 从CSV解析货币值,转换百万和十亿的数字后缀,r,currency,read.csv,suffix,R,Currency,Read.csv,Suffix,我很好奇在R中是否有任何开箱即用的函数可以处理这个问题 我有一个CSV文件,我正在使用read.CSV读取到数据帧中。CSV中的一列包含格式为的货币值 Currency -------- $1.2M $3.1B N/A 我想将这些数据转换成更有用的数字,以便进行计算,因此看起来如下所示: Currency ---------- 1200000 3100000000 NA 我最初的想法是,根据包含*M、*B或N/A的行,以某种方式将数据帧分为3个部分。然后使用gsub替换$和M/B,然后将剩余

我很好奇在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或100000000,最后将3个子集重新加入到1个数据帧中


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

我们可以使用
gsubfn
将“B”、“m”替换为“e+9”、“e+6”,并转换为
数值(
as.numeric


is.na(v1)另一种方法是使用
for循环

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

x既然您使用的是
gsubfn
as.numeric(gsubfn(“([A-Z]\\$)”,list(B='e+9',M='e+6',“$”=”),v1))
会更简单吗?无需
sapply
unname
eval
parse
一些文本,也无需事先设置
NA
(因为
as.numeric
将自行完成)。@nicola是的,这更简单。我想知道为什么我使用了
sapply
。谢谢,谢谢!这正是我想要的。不过,我还是放弃了“is.na(v1)”,谢谢你的建议,尽管我正在尽最大努力“打破”自己使用循环的习惯。R似乎不鼓励它们,我正在尝试体验“R”的方式“做事的方式。然而,我完全理解您来自何方,因为大多数其他脚本语言都会通过循环来处理这类事情:)@user3246693是的,这是真的!在R中不建议使用循环。
v1 <- c('$1.2M', '$3.1B', 'N/A')
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