使用dplyr用新名称替换名称向量

时间:2017-07-21 18:05:14

标签: r dplyr

这是一个我尚未思考或找到使用dplyr的方法的问题,我认为应该能够优雅地解决。

假设我有一个原始数据框,其名称与每个ID相关联。

original_data <- data.frame(id = 1:10, name = letters[1:10], stringsAsFactors = F)

从那里我有数据框,其中包含我想要替换的原始数据框中的名称。

replacement_dataframe <- data.frame(old_name = c("a","b", "c"), 
                                    new_name = c("abra", "banana", "coconut"), 
                                    stringsAsFactors = F)

我通常会做我想使用dplyr的操作,但还没有想到它,就像这样,

original_data$name[original_data$name == "a"] <- "abra"
original_data$name[original_data$name == "b"] <- "banana"
original_data$name[original_data$name == "c"] <- "coconut"

2 个答案:

答案 0 :(得分:2)

现在应该可以了:

ind <- match(original_data$name, replacement_dataframe$old_name)
original_data$name[!is.na(ind)] <- replacement_dataframe$new_name[ind[!is.na(ind)]]

答案 1 :(得分:2)

因为我在PythonR上工作,我会建议:

map=c("a"="abra","b"="banana","c"="coconut")

original_data$name[!is.na(map[original_data$name])]=map[original_data$name][!is.na(map[original_data$name])]


> original_data
   id    name
1   1    abra
2   2  banana
3   3 coconut
4   4       d
5   5       e
6   6       f
7   7       g
8   8       h
9   9       i
10 10       j
编辑:@ Damian的方法,更加整洁。

original_data %>% mutate(name = ifelse(name %in% names(map), map[name], name))

EDIT2:从@ycw

创建map
map <- replacement_dataframe$new_name
names(map) <- replacement_dataframe$old_name