我正在尝试将金额栏转换为数值。我的数据库的一个非常简化的版本是:
SoccerPlayer = c("A","B","C","D","E")
Value = c("10K","25.5K","1M","1.2M","0")
database = data.frame(SoccerPlayer,Value)
我正在面对当前的问题。如果没有点,并且所有金额都处于相同的单位级别,例如仅K(千)或M(百万),这将完美地工作
library(stringi)
database$Value = as.numeric(gsub("K","000",database$Value))
但是由于我的数据中包含K和M值,因此我尝试这样写:
library(stringi)
if(stri_sub(database$Value,-1,-1) == 'M'){
database$Value = gsub("M","000000",database$Value)
}
if(stri_sub(database$Value,-1,-1) == 'K'){
database$Value = gsub("K","000",database$Value)
}
as.numeric(database$Value)
报告以下警告消息
Warning message:
In if (stri_sub(database$Value, -1, -1) == "M") { :
the condition has length > 1 and only the first element will be used
Warning message:
In if (stri_sub(database$Value, -1, -1) == "K") { :
the condition has length > 1 and only the first element will be used
Warning message:
NAs introduced by coercion
在执行该过程之后查看数据,如下所示:
> print(database$Value)
[1] "10000" "25.5000" "1M" "1.2M" "0"
仅转换了K(千)个值,而且在如何解决点问题方面也存在问题,例如“ 25.5000”或“ 1.2000000”(如果M转换可行的话)。
我是编程的新手,对于解决该问题的任何帮助或想法将不胜感激。
答案 0 :(得分:0)
您可以使用M和K的对应值构建矢量(我使用str_detect()
来实现,但是有几种方法可以做到),使用str_remove()
从初始值中删除M和K向量,然后将Value
转换为数字并与创建的向量相乘。
library(stringr)
Value_unity <- ifelse(str_detect(Value, 'M'), 1e6, ifelse(str_detect(Value, 'K'), 1e3, 1))
Value_new <- Value_unity * as.numeric(str_remove(Value, 'K|M'))