Как я могу сравнить два столбца в двух разных DF и добавить значение в другой столбец? - PullRequest
0 голосов
/ 19 сентября 2019

У меня два разных DF (caracteristica_receita и coop_receita_anos2d).Мне нужно сравнить два столбца из них (CNPJ и ANO).Если они совпадают, мне нужно добавить «1» в новый столбец (caracteristica_receita$benford).

Я использовал

caracteristica_receita$benford[which(caracteristica_receita$CNPJ %>%
                                       is.element(coop_receita_anos2d$CNPJ))] <- 1 

Но я не знаю, как это использоватьдля двух столбцов.

caracteristica_receita <- structure(list(CNPJ = c(1234, 5678, 91012, 12346, 96385, 87952, 
7789, 2535, 4459, 5457), NOME_INSTITUICAO = c("XXXX", 
"AAAA", "BBBB", "CCCC", "DDDDD", 
"RRRR", "FFFFF", 
"GGGGG", "HHHHHH", 
"IIIIIII"), ano_fundacao = c(1993, 
1993, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994), ANO = c(2014, 
2015, 2014, 2015, 2016, 2014, 2014, 2015, 2016, 2017), benford = c(0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0)), .Names = c("CNPJ", "NOME_INSTITUICAO", 
"ano_fundacao", "ANO", "benford"), row.names = c(NA, 10L), class = "data.frame")

И

coop_receita_anos2d <- structure(list(CNPJ = c(1234, 5678, 916862, 12346, 96385, 87952, 
7789, 2535, 4459, 46868), ANO = c(2014, 2014, 0, 0, 0, 2014, 
0, 0, 0, 0)), .Names = c("CNPJ", 
"ANO"), row.names = c(1L, 3L, 
7L, 11L, 15L, 19L, 23L, 27L, 31L, 35L), class = "data.frame")

Итак, я хочу:

structure(list(CNPJ = c(1234, 5678, 91012, 12346, 96385, 87952, 
7789, 2535, 4459, 5457), NOME_INSTITUICAO = c("XXXX", 
"AAAA", "BBBB", "CCCC", "DDDDD", 
"RRRR", "FFFFF", 
"GGGGG", "HHHHHH", 
"IIIIIII"), ano_fundacao = c(1993, 
1993, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994), ANO = c(2014, 
2015, 2014, 2015, 2016, 2017, 2014, 2015, 2016, 2017), benford = c(1, 0, 
    0, 0, 0, 1, 0, 0, 0, 0)), .Names = c("CNPJ", "NOME_INSTITUICAO", 
"ano_fundacao", "ANO", "benford"), row.names = c(NA, 10L), class = "data.frame")

Ответы [ 3 ]

0 голосов
/ 19 сентября 2019

Простое решение Base R (при условии, что df и df2 имеют одинаковое количество записей):

df <- caracteristica_receita
df2 <- coop_receita_anos2d
ind <- df$ANO == df2$ANO & df$CNPJ == df2$CNPJ
df$benford <- ifelse(ind, 1, 0)
0 голосов
/ 19 сентября 2019

Спасибо, ребята!Работал!

Кроме того, мой друг тоже отправил ответ:

caracteristica_receita$benford[which(str_c(caracteristica_receita$CNPJ, caracteristica_receita$ANO) %>% 
                                    is.element(str_c(coop_receita_anos2d$CNPJ, coop_receita_anos2d$ANO)))] <- 1 

Спасибо большое!

0 голосов
/ 19 сентября 2019

Вы можете вставить две колонки вместе и использовать match.Преобразовать в логическое значение, а затем в целое число следующим образом:

as.integer(!is.na(match(do.call(paste, caracteristica_receita[c('CNPJ', 'ANO')]), 
                        do.call(paste, coop_receita_anos2d))))

#[1] 1 0 0 0 0 1 0 0 0 0

или присвоить его обратно фрейму данных,

caracteristica_receita$benford <- as.integer(!is.na(....))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...