快速分类R中的字符向量

时间:2014-09-22 15:55:23

标签: r for-loop dataframe

我有一个包含杂乱字符数据列的数据集。我想将其转换为析因数据进行分析。

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个搜索字符串。在可维护代码和性能之间是否存在良好的折衷?

2 个答案:

答案 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"