【问题标题】:Correct wrong prices纠正错误的价格
【发布时间】:2015-07-18 17:55:03
【问题描述】:

数据:

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") 

大家好, 又是我 ;) 不幸的是,我的数据集中有一个非常困难的问题需要解决……正如你在上面看到的,我有一些正确的价格和一些不正确的价格。在错误的价格中,小数点前总是有字母而不是数字(错误的价格没有小数点)。这三个字母是一年中月份的首字母缩写词。例如 Dez 是一年中的第 12 个月,所以正确的数字是 12。所以 Dez 45 应该变成 12.45。 2.示例:六月是一年中的第 6 个月,所以正确的数字是 6。所以 6 月 90 应该变成 6.90。 (希望清楚我的意思)

这就是我想要改造的东西

一月=1。

2 月=2。

先生=3。

四月=4。

麦=5。

六月=6。

7 月=7。

8 月=8。

9 月=9。

确定=10。

11 月 11 日。

德兹=12。

我这次真的不知道怎么解决这个问题……

希望有人有想法

【问题讨论】:

  • Dez 还是 Dec?和 Mar 还是 Mrz? Okt 还是 Oct?
  • Dez,Mrz Okt:这是德语;)
  • 哇 - 在这么短的时间内有这么多好答案:爱你们! :)

标签: r


【解决方案1】:

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

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)

【讨论】:

    【解决方案2】:

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

    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" 
    

    【讨论】:

      【解决方案3】:

      我的解决方案是在“错误价格”总是包含一个两位数的假设下工作的。

      让我从再次构建您的示例数据集开始:

      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
      

      【讨论】:

        猜你喜欢
        • 2014-11-09
        • 1970-01-01
        • 2016-08-20
        • 1970-01-01
        • 2013-08-19
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        • 2016-04-02
        相关资源
        最近更新 更多