0

我正在尝试使用年份、品牌和型号将来自 NHTSA 的解码 VIN 数据与来自fueleconomy.gov 的车辆数据连接起来。以下是我尝试加入的数据示例:

# This is the first dataframe  
make <- c("PORSCHE", "TESLA", "MITSUBISHI")
model <- c("Cayenne", "Model S", "Outlander - PHEV")
year <- c(2017, 2013, 2018)
electrification_level <- (PHEV, BEV, PHEV)
vin_data <- data.frame(make, model, year, electrification_level)

# This is the second dataframe    
make <- c("Porsche", "Tesla", "Mitsubishi")
# There are multiple versions of the models (an average of these would be ideal - e.g. avg. mpg)
model <- c("Cayenne S e-Hybrid", "Model S AWD - P85D", "Outlander 2WD")
year <- c(2017, 2013, 2018)
# These mpg are made up for the example
mpg <- c(75, 120, 80)
fueleconomy_data <- data.frame(make, model, year, mpg) 

我在尝试完成此加入时遇到了多个问题。

  1. 我需要使用 make 和 year 加入数据,但 make 需要不区分大小写。
  2. 我需要对模型执行不精确匹配,并且可能对模型的 mpg 值进行平均,因为每个模型的fueleconomy.gov 数据中有多个条目(例如2WD、4WD、不同的发动机尺寸、混合动力等)。

我参考了以下问题来尝试解决这个谜语:

我还联系了fueleconomy.gov 和NHTSA,看看他们是否有能力加入基于车辆ID 的数据,但我想问问社区是否也有一个简单的解决方案。

4

2 回答 2

1

你的reprex中有一些错别字,所以我在下面再次粘贴。

# This is the first dataframe
make <- c("PORSCHE", "TESLA", "MITSUBISHI")
model <- c("Cayenne", "Model S", "Outlander - PHEV")
year <- c(2017, 2013, 2018)
electrification_level <- c("PHEV", "BEV", "PHEV")
vin_data <- data.frame(make, model, year, electrification_level, stringsAsFactors = FALSE)

# This is the second dataframe    
make <- c("Porsche", "Tesla", "Mitsubishi")
# There are multiple versions of the models (an average of these would be ideal - e.g. avg. mpg)
model <- c("Cayenne S e-Hybrid", "Model S AWD - P85D", "Outlander 2WD")
year <- c(2017, 2013, 2018)
# These mpg are made up for the example
mpg <- c(75, 120, 80)
fueleconomy_data <- data.frame(make, model, year, mpg, stringsAsFactors = FALSE) 

对于您的第一个问题,我将使用toupper函数将它们全部更改为大写,然后使用完全连接。

df_joined <- vin_data %>% 
  full_join(fueleconomy_data %>% 
    dplyr::mutate(make = base::toupper(make)), by = "make")

对于#2,您可以使用一些 if/else 逻辑。我试过了,但你可以根据自己的内心进行调整。

df_joined %>%  
  dplyr::mutate(model_same = if_else(condition = word(model.x) == word(model.y), true = TRUE, false = FALSE))
于 2019-12-17T16:58:52.050 回答
0

你可以使用RecordLinkae包来获得你想要的。您可以使用 0.6 的 epiwt 来提高或降低文本匹配的准确性。

library(RecordLinkage)
pairs <- compare.linkage(fueleconomy_data, vin_data, strcmp = 2, exclude=c(3,4), blockfld = 1) 
epiwt <- epiWeights(pairs) 
epiclass <- epiClassify(epiwt, .6)
getPairs(epiclass, show="links", single.rows=T)

make.1 model.1 make.2 model.2 year.2 electrification_level.2 3 MITSUBISHI Outlander 2WD MITSUBISHI Outlander - PHEV 2018 PHEV 1 PORSCHE Cayenne S e-Hybrid PORSCHE Cayenne 2017 PHEV 2 TESLA Model S AWD - P85D TESLA Model S 2013 BEV

这是为了使列大写。你需要在记录链接之前这样做
vin_data$make <- toupper(vin_data$make) fueleconomy_data$make <- toupper(fueleconomy_data$make)

于 2019-12-17T17:24:34.287 回答