我们说我的数据框中的一列是指城市的名称。城市名称表示为" longformA"," longformB",我想用" shrtfrmA"," shrtfrmB&替换它们#34 ;.每个" longform" name有一个关联的" shrtfrm"应该替换它的名称。
我有一个涉及命名列表和purrr的解决方案在我脑海中蹦蹦跳跳,但我无法对其进行概念化。命名列表将具有以下结构:
city_names_short <- list("ANA" = "Anaheim", "BOS" = "Boston")
等等,等等。
example_df$city[example_df$city == "Anaheim"] <- "ANA"
example_df$city[example_df$city == "Boston"] <- "BOS"
我可以按照上面的说法一个接一个地替换它们,但我想要更优雅一点。
非常感谢任何建议!
答案 0 :(得分:2)
我建议将列表取消列出到命名向量,然后使用match
创建短名称:
city_names_short <- unlist(city_names_short)
df$shortname <- names(city_names_short)[match(df$city, city_names_short)]
答案 1 :(得分:1)
方法1
您可以使用sapply
:
df$city <- sapply(df$city, function(city) {
names(city_names_short)[city_names_short == city]
})
sapply
中的函数找到与每个城市名称匹配的列表项的名称(即缩短的城市名称)。
方法2
您可以通过反转city_names_short
列表来创建地图:
city_map <- names(city_names_short)
names(city_map) <- city_names_short
df$city <- city_map[df$city]
答案 2 :(得分:0)
基础R中有一个函数setNames
:
map = setNames(c("ANA","BOS"),c("Anaheim","Boston"))
df$city_short = map[df$city_long]