使用键值dataframe替换列值

使用键值dataframe替换列值,r,dplyr,mutate,R,Dplyr,Mutate,我必须想象这个问题不是唯一的,但我正在努力寻找哪些词,所以如果这是多余的,请指向我的帖子 我有一个数据帧 test <- data.frame(x = c("a", "b", "c", "d", "e")) x 1 a 2 b 3 c 4 d 5 e 这里有一种方法,尽管我认为有较短的方法: library(dplyr) test %>% left_join(metadata, by = c("x" = "a")) %>% mutate(b = coalesce

我必须想象这个问题不是唯一的,但我正在努力寻找哪些词,所以如果这是多余的,请指向我的帖子

我有一个数据帧

test <- data.frame(x = c("a", "b", "c", "d", "e"))

  x
1 a
2 b
3 c
4 d
5 e

这里有一种方法,尽管我认为有较短的方法:

library(dplyr)
test %>%
  left_join(metadata, by = c("x" = "a")) %>%
  mutate(b = coalesce(b, x))

#  x         b
#1 a         a
#2 b         b
#3 c REPLACE_1
#4 d REPLACE_2
#5 e         e
(注意,我通过将
元数据
加载为字符,而不是因子,使数据类型匹配:

metadata <- data.frame(stringsAsFactors = F,
  a = c("c", "d"),
  b = c("REPLACE_1", "REPLACE_2"))

metadata使用
stringsAsFactors=FALSE
导入数据,并使用
dplyr
stringr
,您可以执行以下操作:

test %>%
 mutate(x = str_replace_all(x, setNames(metadata$b, metadata$a)))

          x
1         a
2         b
3 REPLACE_1
4 REPLACE_2
5         e
或者使用@Sotos的基本思想:

test %>%
 mutate(x = pmax(x, metadata$b[match(x, metadata$a, nomatch = x)], na.rm = TRUE))
你可以

test$x[test$x %in% metadata$a] <- na.omit(metadata$b[match(test$x, metadata$a)])

 #         x
#1         a
#2         b
#3 REPLACE_1
#4 REPLACE_2
#5         e

test$x[在%metadata$a中测试$x%使用
匹配
+
替换

test <- within(test,x <- replace(as.character(x),match(metadata$a,x),as.character(metadata$b)))

您可以使用
match
使此更新加入

我看了一下,或者。
test$x[test$x %in% metadata$a] <- na.omit(metadata$b[match(test$x, metadata$a)])

 #         x
#1         a
#2         b
#3 REPLACE_1
#4 REPLACE_2
#5         e
test <- within(test,x <- replace(as.character(x),match(metadata$a,x),as.character(metadata$b)))
> test
          x
1         a
2         b
3 REPLACE_1
4 REPLACE_2
5         e
i <- match(metadata$a, test$x)
test$x[i]  <- metadata$b
# test
#          x
#1         a
#2         b
#3 REPLACE_1
#4 REPLACE_2
#5         e
i <- match(test$x, metadata$a)
j <- !is.na(i)
test$x[j]  <- metadata$b[i[j]]
test
#          x
#1         a
#2         b
#3 REPLACE_1
#4 REPLACE_2
#5         e
test <- data.frame(x = c("a", "b", "c", "d", "e"), stringsAsFactors = FALSE)
metadata <- data.frame(
  a = c("c", "d"),
  b = c("REPLACE_1", "REPLACE_2"), stringsAsFactors = FALSE)