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

基于R中的两列进行索引/匹配,是否可能?,r,R,我有以下索引列表,其中包含六种类型的汽车的名称及其与DF1相关的ID 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",

我有以下索引列表,其中包含六种类型的汽车的名称及其与DF1相关的ID

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替换这些名称

我已尝试使用以下替换功能:

replace(DF2, DF1$Car, DF2$ID)
但这似乎不太管用。如果替换不是最好的解决方案,我愿意接受其他建议。

这里有一个使用tidyverse软件包套件的方法。聚集和扩散功能类似于基础中的重塑。实际的替换是使用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)
下面是一个使用tidyverse软件包套件的方法。聚集和扩散功能类似于基础中的重塑。实际的替换是使用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)

下面是一个在base中使用apply和gsub的方法


下面是一个在base中使用apply和gsub的方法


非常感谢你,效果很好!假设我只对唯一的ID感兴趣,那么如果一年和一个城市有一个ID列表,比如1,1,2,我想让它删除重复的ID,这样它只输出1,2,在这个代码中可能吗?我曾尝试在代码中的粘贴函数之外添加一个唯一的函数,但它似乎没有做任何事情。它不会做任何事情-粘贴的输出是一个元素。我将以一种有效的方式修改代码。非常感谢,效果很好!假设我只对唯一的ID感兴趣,那么如果一年和一个城市有一个ID列表,比如1,1,2,我想让它删除重复的ID,这样它只输出1,2,在这个代码中可能吗?我曾尝试在代码中的粘贴函数之外添加一个唯一的函数,但它似乎没有做任何事情。它不会做任何事情-粘贴的输出是一个元素。我将以一种可行的方式修改代码。此解决方案有一个恼人的副作用,即将所有变量都转换为因子。好的一点是,我编辑以显式设置stringsAsFactors参数,在本例中,该参数确实返回提供的原始类型。如果类型保留是一个问题,则需要一些索引。此解决方案会产生恼人的副作用,即将所有变量都转换为因子。很好,我编辑了stringsAsFactors参数以显式设置,在本例中,该参数会返回提供的原始类型。如果类型保留是一个问题,则需要一些索引。
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)