基于R中的两列进行索引/匹配,有可能吗?

时间:2018-06-20 15:16:46

标签: r

我有以下“索引”列表,其中包含六种汽车的名称及其关联的ID(DF1)。

DF1 = structure(list(Car = c("Toyota", "Mitsubishi", "Audi", 
"Merecedes", "Ford", "Fiat"), ID = structure(c(1L, 
2L, 3L, 4L, 5L, 6L), .Label = c("1", "2", "3", "4", "5", 
"6"), class = "factor")), .Names = c("Car", 
"ID"), row.names = c(NA, 6L), class = "data.frame")

然后,我有了这份包含各种信息(DF2)的列表。

DF2 = structure(list(City = c("New York City", "Los Angeles", "Chicago", "Miami", "Dallas", "Atlanta"), `2005` = c("", "", "", 
"Mercedes, Mitsubishi", "Ford", ""), `2006` = c("", 
"", "", "Ford", "Audi", ""), `2007` = c("Toyota", 
"", "Toyota", "", "Fiat, Audi, Audi", ""
), `2008` = c("Fiat", "", "", "Mitsubishi, Merecedes, Fiat, Mitsubishi", 
"Audi, Fiat, Merecedes", ""), `2009` = c("Fiat", 
"", "", "Audi, Toyota", "Toyota, Audi, Fiat", 
""), `2010` = c("", "", "", "Toyota, Merecedes, Merecedes, Audi, Mitsubishi", 
"", ""), `2011` = c("", "", "", "", "Toyota", ""), `2012` = c("", 
"", "", "Merecedes, Ford, Merecedes, Toyota", "Toyota", 
"Fiat"), `2013` = c("Fiat", "", "Toyota", "", "", 
""), `2014` = c("", "", "Fiat, Mitsubishi", "", "Mitsubishi, Audi, Toyota, Merecedes, Toyota, Mitsubishi, Fiat, Mitsubishi, Fiat", 
""), `2015` = c("", "", "Toyota", "", "Toyota, Merecedes", 
""), `2016` = c("", "", "", "", "", ""), `Contact` = c(NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_
), `Time` = c("2011", "2015", "2015", "2006, 2006, 2005, 2005, 2007", 
"2014, 2011", "2007"), Cut = c("2011", "2015", "2015", "2005", 
"2011", "2007")), .Names = c("City", "2005", "2006", "2007", "2008", 
"2009", "2010", "2011", "2012", "2013", "2014", "2015", "2016", 
"Contact", "Time", "Cut"), row.names = c(NA, 
6L), class = "data.frame")

第2列至第13列包含不同汽车的名称。我想R要做的就是简单地用上面“索引”列表中的ID替换这些名称。

我尝试使用替换function,例如:

replace(DF2, DF1$Car, DF2$ID)

但这似乎不太奏效。如果replace不是最好的解决方案,我愿意接受其他建议。

3 个答案:

答案 0 :(得分:5)

这是使用tidyverse套软件包的方法。 gatherspread的功能类似于reshape。实际的替换操作是使用match函数完成的,但是我们需要先用str_split用“,”分割汽车列表,然后进行替换,然后全部粘贴回去。

DF2 %>%
  gather(year, cars, `2005`:`2016`) %>%
  mutate(year, cars_id = map_chr(str_split(cars, ", "), ~ if(length(.x > 0)) paste(unique(DF1$ID[match(.x, DF1$Car)]), collapse = ", ") else "")) %>%
  select(-cars) %>%
  spread(year, cars_id)

答案 1 :(得分:0)

这是使用applygsub的基础方法

DF2m <- as.matrix(DF2)

apply(DF1, 1, function(x) {
  DF2m <<- gsub(x[1], x[2], DF2m)
})

DF2new <- as.data.frame(as.matrix(DF2m, nrow=nrow(DF2)), stringsAsFactors = FALSE)

答案 2 :(得分:0)

rep_carn_wid <- function(x, lo = DF1) {
  for (i in 1:nrow(lo)) {
    x <- gsub(lo[i, 1], lo[i, 2], x)
  }
  x
}

DF2[2:13] <- lapply(DF2[2:13],  rep_carn_wid)