Apply and ifelse for multiple datasets in panel data

у меня возник вопрос по поводу использования ifelse функции для нескольких датасетов.

Мой датасет 1 "dummy" состоит из dummy variables c NA, к примеру:

 Date    C1     C2      C3
01.2002  1       1       0
02.2002  0       NA      0     
03.2002  1       NA       1
 ...       
         

Датасет 2 "returns" состоит из прибыли компаний:

Date    C1     C2      C3
01.2002  0.24  0.05    -0.01
02.2002  0.1   -0.02    0.04    
03.2002  0.05   0.03   -0.02
...       

Я хочу с помощью ifelse создать новый датафрейм, где я буду видеть прибыль только тех компаний, которые в dummy имеют значение 1.

К примеру:

Date    C1     C2      C3
01.2002  0.24   0.05    NA
02.2002  NA     NA    NA    
03.2002  0.05   NA   -0.02

Моя первая мысль была:

Companies1<-apply(dummy[-1,-1], 2, FUN=function(x){ifelse(x==1,returns,NA)})

но в этом случае код, естественно, неправильный т.к. я не знаю, как применить датафрейм returns.


Ответы (1 шт):

Автор решения: aleksandr barakin

если обе таблицы имеют одинаковую размерность и данные в первом столбце (у вас — с датой) полностью идентичны, то задача сводится к присвоению значения NA тем ячейкам первой таблицы, в которых во второй таблице значение либо равно 0 (кстати, логичнее было использовать логические значения FALSE/TRUE, сокращённо F/T, вместо нулей/единиц), либо отсутствует (специальное значение NA):

таблица2[таблица1 == 0 | is.na(таблица1)] <- NA

объяснение. допустим, есть такие данные:

set.seed(42)
таблица1 <- data.frame(дата=seq(as.Date("2021/2/1"),by="month",length.out=3),к1=sample(1:20,3,replace=T),к2=sample(1:20,3,replace=T),к3=sample(1:20,3,replace=T))
таблица2 <- data.frame(дата=таблица1$дата,к1=sample(c(0,1,NA),3,replace=T),к2=sample(c(0,1,NA),3,replace=T),к3=sample(c(0,1,NA),3,replace=T))
таблица1
#>         дата к1 к2 к3
#> 1 2021-02-01 19 17 15
#> 2 2021-03-01 19 13  3
#> 3 2021-04-01  6 11 14
таблица2 
#>         дата к1 к2 к3
#> 1 2021-02-01 NA NA NA
#> 2 2021-03-01  1  0 NA
#> 3 2021-04-01 NA  1  0

какие ячейки в таблице2 равны нулю? можно посмотреть так:

таблица2 == 0
#>       дата    к1    к2   к3
#> [1,] FALSE    NA    NA   NA
#> [2,] FALSE FALSE  TRUE   NA
#> [3,] FALSE    NA FALSE TRUE

а какие отсутствуют? можно посмотреть так (сравнение с NA всегда возвращает FALSE, для проверки надо использовать функцию is.na()):

is.na(таблица2)
#>       дата    к1    к2    к3
#> [1,] FALSE  TRUE  TRUE  TRUE
#> [2,] FALSE FALSE FALSE  TRUE
#> [3,] FALSE  TRUE FALSE FALSE

вместе оба условия:

таблица2 == 0 | is.na(таблица2)
#>       дата    к1    к2   к3
#> [1,] FALSE  TRUE  TRUE TRUE
#> [2,] FALSE FALSE  TRUE TRUE
#> [3,] FALSE  TRUE FALSE TRUE

а если теперь подставить это выражение как индекс в таблице1, то можно сразу и присвоить значние нужным элементам (тем, которые в выражении таблица2 == 0 | is.na(таблица2) имеют значение TRUE):

таблица1[таблица2 == 0 | is.na(таблица2)] <- NA

результат:

таблица1
#>         дата к1 к2 к3
#> 1 2021-02-01 NA NA NA
#> 2 2021-03-01 19 NA NA
#> 3 2021-04-01 NA 11 NA

Created on 2021-02-09 by the reprex package (v0.3.0)

→ Ссылка