使用命名列表替换列中的值

时间:2018-04-12 14:04:41

标签: r

我们说我的数据框中的一列是指城市的名称。城市名称表示为" 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"

我可以按照上面的说法一个接一个地替换它们,但我想要更优雅一点。

非常感谢任何建议!

3 个答案:

答案 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]