我有以下"索引"列表,其中包含六种类型的汽车名称及其相关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")
Run Code Online (Sandbox Code Playgroud)
然后我有各种信息列表(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")
Run Code Online (Sandbox Code Playgroud)
第2列到第13列包含不同车辆的名称.我希望R做的是简单地用上面"索引"列表中的ID替换这些名称.
我试过用这样的替换function:
replace(DF2, DF1$Car, DF2$ID)
Run Code Online (Sandbox Code Playgroud)
但这似乎并没有奏效.如果replace不是最佳解决方案,我愿意接受其他建议.
这是使用tidyverse包套件的方法. gather和spread功能类似于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)
Run Code Online (Sandbox Code Playgroud)