这是一个我尚未思考或找到使用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"
答案 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)
因为我在Python
和R
上工作,我会建议:
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