R 从CSV解析货币值,转换百万和十亿的数字后缀
我很好奇在R中是否有任何开箱即用的函数可以处理这个问题 我有一个CSV文件,我正在使用read.CSV读取到数据帧中。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,然后将剩余
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