R: цикл ifelse на нескольких фреймах данных - PullRequest
0 голосов
/ 24 апреля 2019

Я хотел бы создать эффективный оператор ifelse, чтобы, если столбцы из df2 совпадали со столбцами из df1, то эта строка в df2 кодировалась определенным образом. Мой код работает, но очень неэффективен.

Пример данных:

df1

A B C
111 2 1
111 5 2
111 7 3
112 2 4
112 8 5
113 2 6

Df2

A B
112 2
111 2
113 2
111 5
111 7
112 8

Желаемый результат:

Df2

A B C
112 2 4
111 2 1
113 2 6
111 5 2
111 7 3
112 8 5

Что я сделал, так это:
Df2$C<- ifelse(Df2$A == 111 & Df2$B == 2, 1, 0)
Df2$C<- ifelse(Df2$A == 111 & Df2$B == 5, 2, 0)
Df2$C<- ifelse(Df2$A == 111 & Df2$B == 7, 3, 0) ...

Это работает, но есть ли способ, чтобы df2 мог ссылаться на столбцы в df1 и создавать столбец df2 $ C, чтобы каждую комбинацию не нужно было печатать вручную?

1 Ответ

2 голосов
/ 24 апреля 2019

Обычно это делается с помощью объединения.left_join из dplyr соединит каждую строку в вашей первой таблице с каждой из соответствующих строк во второй таблице.

https://dplyr.tidyverse.org/reference/join.html

library(dplyr)
Df2 %>% left_join(Df1)

Joining, by = c("A", "B")
    A B C
1 112 2 4
2 111 2 1
3 113 2 6
4 111 5 2
5 111 7 3
6 112 8 5

merge от базы R даст аналогичный результат, но не сохранит исходный порядок строк без каких-либо дополнительных споров.

Объединение двух фреймов данных с сохранением исходного порядка строк

merge(Df2, Df1)
    A B C
1 111 2 1
2 111 5 2
3 111 7 3
4 112 2 4
5 112 8 5
6 113 2 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...