数据:
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
这次我真的不知道如何解决这个问题...
希望有人有个主意
答案 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