Замените значения столбца, используя ключевой кадр данных - PullRequest
3 голосов
/ 11 февраля 2020

Я должен представить, что этот вопрос не является уникальным, но я изо всех сил пытался определить, какие слова искать, поэтому, если это излишне, укажите мне на пост!

У меня есть фрейм данных

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 голосов
/ 11 февраля 2020

Базовое решение R с использованием match + replace

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 голосов
/ 11 февраля 2020

Импортируя ваши данные с помощью 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

Или использовать базовую c идею из @Sotos:

test %>%
 mutate(x = pmax(x, metadata$b[match(x, metadata$a, nomatch = x)], na.rm = TRUE))
2 голосов
/ 11 февраля 2020

Можно сделать,

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 голос
/ 11 февраля 2020

Вы можете использовать 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)
1 голос
/ 11 февраля 2020

Вот один из подходов, хотя я предполагаю, что есть более короткие:

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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...