使用键值数据框替换列值

3

我想这个问题不是唯一的,但我在努力搜索哪些词语,如果这是多余的,请指向文章!

我有一个数据框

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

  x
1 a
2 b
3 c
4 d
5 e

我想使用一个单独的数据框替换部分值

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

导致:
  x
1 a
2 b
3 REPLACE_1
4 REPLACE_2
5 e

5个回答

3
使用matchreplace的基本R解决方案。
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

2

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

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))

2

您可以做以下操作:

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

1

这里有一种方法,虽然我认为可能有更短的方法:

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 作为字符加载而不是因子来使数据类型匹配:)
metadata <- data.frame(stringsAsFactors = F,
  a = c("c", "d"),
  b = c("REPLACE_1", "REPLACE_2"))

1
你可以使用match来进行这个更新连接
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接