我有一个包含杂乱字符数据列的数据集。我想将其转换为析因数据进行分析。
carData <- data.frame(car=c("Mustang", "Toyota Tercel", "M3", "Datsun 240Z", "Chevy Malibu"),
year=c("2001", "1994", "2004", "1980", "2000"))
car year
1 Mustang 2001
2 Toyota Tercel 1994
3 M3 2004
4 Datsun 240Z 1980
5 Chevy Malibu 2000
我已经创建了几个列表来帮助解决这个问题,一个列表包含搜索字符串,另一个列表包含相关类别。
cars <- c("Mustang", "Toyota", "M3", "Chevy")
make <- c("Ford", "Toyota", "BMW", "Chevrolet")
我的目的是遍历列表并在新变量中分配类别。
categorize <- function(df, searchString, category) {
df$make <- "OTHER"
for(i in seq(1, length(searchString), 1)) {
list <- grep(searchString[i], df[,1], ignore.case=TRUE)
if (length(list) > 0) {
for(j in seq(1, length(list), 1)) {
df$make[list[j]] <- category[i]
}
}
}
df
}
cleanCarData <- categorize(carData, cars, make)
输出是:
car year make
1 Mustang 2001 Ford
2 Toyota Tercel 1994 Toyota
3 M3 2004 BMW
4 Datsun 240Z 1980 OTHER
5 Chevy Malibu 2000 Chevorlet
我的代码有效,我的问题是我的数据有大约1M行,完成需要大约3个小时。相反,如果我为每个语句创建一个带衬里的语句,则完成所有语句只需不到3分钟。
df$make <- "OTHER"
df$make[grep("Mustang", df$car, ignore.case=TRUE)] <- "Ford"
df$make[grep...]
到目前为止,我有50个搜索字符串,并且在我处理数据时可以轻松拥有100个搜索字符串。在可维护代码和性能之间是否存在良好的折衷?
答案 0 :(得分:1)
你可以通过消除内循环来改善事情
categorize <- function(df, searchString, category) {
df$make <- "OTHER"
for(i in seq_along(searchString)) {
list <- grep(searchString[i], df[,1], ignore.case=TRUE)
if (length(list) > 0) {
df$make[list] <- category[i]
}
}
df
}
很难大规模测试,因为您的样本数据不是很大,所以大部分时间都花在了大部分时间。
答案 1 :(得分:0)
这是一种可能性:
cleanCarData = carData
for(k in 1:length(cars)) {
sel=grep(cars[k], as.character(cleanCarData$car))
cleanCarData[sel,"make"] = make[k]
}
cleanCarData$make[is.na(cleanCarData$make)] = "OTHER"