将因子转换为数字,带点,千(K)和百万(M)的缩写

时间:2019-06-03 00:49:02

标签: r

我正在尝试将金额栏转换为数值。我的数据库的一个非常简化的版本是:

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转换可行的话)。

我是编程的新手,对于解决该问题的任何帮助或想法将不胜感激。

1 个答案:

答案 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'))