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 шт):
если обе таблицы имеют одинаковую размерность и данные в первом столбце (у вас — с датой) полностью идентичны, то задача сводится к присвоению значения 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)