纠正错误的价格

时间:2015-07-18 17:55:03

标签: r

数据:

DB1 <- data.frame(orderItemID  = 1:10,     
price = c("12.90","8.90","Mrz 40","79.95","Dez 45", "7.99","Jun 90","129.90","Jul 90","49.95")  

预期结果:

   DB1 <- data.frame(orderItemID  = 1:10,     
 price = c("12.90","8.90","3.40","79.95","12.45", "7.99","6.90","129.90","7.90","49.95") 
嘿伙计们, 这是我了;)不幸的是,我的数据集中有一个非常困难的问题我需要解决...正如你在上面看到的,我有一些正确的价格不正确。在不正确的价格,总是有字母而不是小数点前的数字(并且错误的价格没有小数点)。这3个字母是一年中的几个月的首字母缩略词。所以例如Dez是一年中的12个月,所以正确的数字是12.所以Dez 45应该变成12.45。 2.example:Jun是一年中的6个月,所以正确的数字是6.所以Jun 90应该变成6.90。 (希望清楚我的意思)

那就是我想要改变的东西

一月= 1。

二月= 2。

MRZ = 3。

月= 4。

麦= 5。

君= 6。

月= 7。

八月= 8。

月= 9。

十月= 10

月= 11

费尔南德斯= 12

这次我真的不知道如何解决这个问题...

希望有人有个主意

3 个答案:

答案 0 :(得分:4)

如果您使用每月的前三个字母

library(qdap) # mgsub
DB1$price<-mgsub(month.abb,1:12,DB1$price) 
#month.abb from baseR give abbreviated months

如果您坚持自己的月份缩写:

month_abb <-c("Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez")
DB1$price<-mgsub(month_abb,1:12,DB1$price)

答案 1 :(得分:3)

这是使用正则表达式的一种方式。首先,确保价格列是字符向量而不是因子

DB1$price<-as.character(DB1$price)

然后定义您想要的替换

replacewith<-c("Jan"="1.", "Feb"="2.", "Mrz"="3.", "Apr"="4.", "Mai"="5.", "Jun"="6.", "Jul"="7.", "Aug"="8.", "Sep"="9.", "Okt"="10.", "Nov"="11.", "Dez"="12.")

现在将它们转换为常规表达式并与价格列匹配

re <- paste0("^(",paste(names(replacewith),collapse="|"), ") ")
m <- regexpr(re,DB1$price, perl=T)
mm <- regmatches(DB1$price, m)

现在我们查找替换

regmatches(DB1$price, m) <- replacewith[substr(mm, 1, nchar(mm)-1)]
DB1$price
#  [1] "12.90"  "8.90"   "3.40"   "79.95"  "12.45"  "7.99"   "6.90"   "129.90" "7.90"   "49.95" 

答案 2 :(得分:1)

我的解决方案是在假设价格错误的情况下运作的。总是包含一个有两个挖掘的数字。

首先让我再次构建您的示例数据集:

DB1 <- data.frame(orderItemID  = 1:10,     
              price = c("12.90","8.90","Mrz 40","79.95","Dez 45", "7.99","Jun 90","129.90","Jul 90","49.95"),
              stringsAsFactors=FALSE) 

我添加了参数stringsAsFactors=FALSE,这对解决方案起作用很重要。它确保价格实际上是字符串而不是因子变量。

然后,解决方案分两步进行。首先,我只是将价格转换为数字:

price_num <- as.numeric(DB1$price)

这会将错误的价格转换为NA,这样可以通过

轻松找到它们
wrong_prices <- is.na(price_num)

接下来,您必须定义实际使用月份的缩写:

m_abb <- c("Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez")

有内置变量month.abb。如果它与数据集中的月份缩写相匹配,您当然可以使用该缩写。这取决于您的区域设置,在我的情况下,我希望手动重新定义变量。

不,我定义了将错误的价格转换为数字的函数:

convert_wrong_prices <- function(wp) {
   wp_split <- strsplit(wp," ")
   convert_wps <- function(wps) {
      match(wps[1],m_abb) + as.numeric(wps[2])/100
   }
   wp_converted <- sapply(wp_split,convert_wps)
   return (wp_converted)
}

最后,它可以应用:

price_num[wrong_prices] <- convert_wrong_prices(DB1$price[wrong_prices])
DB1$price_num <- price_num