Заменить столбец условно при сопоставлении в другом столбце - PullRequest
0 голосов
/ 01 апреля 2020

Я хотел бы сопоставить два столбца на основе другого. Я пытаюсь использовать функцию match, но получаю значения NA.

a <- data.frame( x =  c(1,2,3,4,5)) 
b <- data.frame( y =  c(3,4),
                 z = c("A","B"))

a$x <- b$z[match(a$x, b$y)]

I get:
> a
     x
1 <NA>
2 <NA>
3    A
4    B
5 <NA>
I would like :
> a
     x
1    1
2    2
3    A
4    B
5    5

Ответы [ 3 ]

1 голос
/ 01 апреля 2020

Без переименования я бы предложил это, которое заканчивается тем же результатом, что и broti

tmp.merge<- merge(a,b,by.x = "x", by.y="y", all = TRUE)
for (elm in as.numeric(row.names(tmp.merge[which(!is.na(tmp.merge$z)),]))){
  tmp.merge[elm,'x'] <- as.character(tmp.merge[elm,'z'])
}

tmp.merge

результат:

> tmp.merge
  x    z
1 1 <NA>
2 2 <NA>
3 A    A
4 B    B
5 5 <NA>
1 голос
/ 01 апреля 2020

Следующее работает, но вам нужно установить stringsAsFactors = F при определении фрейма данных b

a <- data.frame( x =  c(1,2,3,4,10,13,12,11)) 
b <- data.frame( y =  c(10,12,13),
                 z = c("A","B","C"),stringsAsFactors = F)
#
a %>% mutate(x = ifelse(x %in% b$y,b$z[match(x,b$y)],x))

Вывод

   x
1  1
2  2
3  3
4  4
5  A
6  C
7  B
8 11
1 голос
/ 01 апреля 2020

Сначала переименуйте столбец цифры c в b, чтобы объединить два фрейма данных:

b <- b %>% rename(x = y)

Затем объедините их, превратите переменные в символ и замените значения столбца. x с z, если не NA.

a <- merge(a, b, by = "x", all.x = TRUE) %>% 
  mutate_all(as.character) %>% 
  mutate(x = ifelse(is.na(z), x, z))

Результат:

  x    z
1 1 <NA>
2 2 <NA>
3 A    A
4 B    B
5 5 <NA>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...