我有以下“索引”列表,其中包含六种汽车的名称及其关联的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
不是最好的解决方案,我愿意接受其他建议。
答案 0 :(得分:5)
这是使用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)
答案 1 :(得分:0)
这是使用apply
和gsub
的基础方法
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)