заменить значение другим кадром данных в качестве ссылки - PullRequest
1 голос
/ 23 февраля 2020

Я пытаюсь заменить столбец a1 фрейма данных df1 значением b1 фрейма данных df1, если a1 соответствует. Пожалуйста, помогите мне добиться этого, используя основные функции c R

df1 <- data.frame(a1 = c("b2","c2","abc2"),b1 = c("bb2","cc2","d2"))
df2 <- data.frame(d1 = c("sale","sale2","sale3"),a1 = c("b2","c2","d2"))

> df2
     a1 b1
1  sale b2
2 sale2 c2
3 sale3 d2

Ожидаемый результат:

     a1  b1
1  sale bb2
2 sale2 cc2
3 sale3  d2

Ответы [ 2 ]

3 голосов
/ 23 февраля 2020

Лично мне нравится добавлять справочную таблицу в исходную таблицу. Например, (используя dplyr) вы могли бы сделать что-то вроде:

df2 %>% left_join(df1, by = "a1") %>% mutate(new_b1 = ifelse(!is.na(b1), b1, a1))

Что приводит к

    d1 a1   b1 new_b1
1  sale b2  bb2    bb2
2 sale2 c2  cc2    cc2
3 sale3 d2 <NA>     d2

Для того, чтобы получить заявленный желаемый результат, хотя он и выглядит немного странно менять столбец слияния, но все возможно, вы можете сделать что-то вроде:

df2 %>% left_join(df1, by = "a1") %>% 
  mutate(b1 = ifelse(!is.na(b1), b1, a1)) %>% 
  select(-a1) %>% 
  rename(a1 = d1)

, что приведет к

     a1  b1
1  sale bb2
2 sale2 cc2
3 sale3  d2
2 голосов
/ 23 февраля 2020

Одна base R возможность может быть:

pmax(df2$a1, df1$b1[match(df2$a1, df1$a1)], na.rm = TRUE)

[1] "bb2" "cc2" "d2"

Требуется импортировать данные, используя stringsAsFactors = FALSE.

Или:

ifelse(is.na(matching), df2$a1, matching); matching <- df1$b1[match(df2$a1, df1$a1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...