Как объединить несколько таблиц данных с конкретными условиями на NA - PullRequest
0 голосов
/ 07 мая 2018

У меня есть data.table в этом формате:

dt1 <- data.table(row_names=1:5, perf=c(2,NA,NA,3,NA), ticker=rep("aa",5))
dt2 <- data.table(row_names=1:5, perf=c(NA,1,2,5,NA), ticker=rep("aapl",5))

   row_names perf ticker
1:         1    2     aa
2:         2   NA     aa
3:         3   NA     aa
4:         4    3     aa
5:         5   NA     aa  

   row_names perf ticker
1:         1   NA   aapl
2:         2    1   aapl
3:         3    2   aapl
4:         4    5   aapl
5:         5   NA   aapl  

У меня есть N этих таблиц данных, и я хотел бы присоединиться к ним, чтобы я взял среднее значение perf. Однако я не хочу этого делать, если для одной из таблиц данных существует значение NA. В случае выше, я хотел бы получить data.table:

> res <- data.table(row_names=1:5,perf=c(2,1,2,4,NA),tickers=c("aa","aapl","aapl","aa,aapl",NA))
> res
   row_names perf tickers
1:         1    2      aa
2:         2    1    aapl
3:         3    2    aapl
4:         4    4 aa,aapl
5:         5   NA      NA

Я знаю, что мог бы сделать что-то подобное, чтобы получить средства с удаленными NA:

rbind(dt1,dt2)[,list("perf"=mean(perf,na.rm=T)),by=row_names]

   row_names perf
1:         1    2
2:         2    1
3:         3    2
4:         4    4
5:         5  NaN

Как мне установить условия для столбца tickers, чтобы вставить их на основе конфликтующих NA. Кроме того, является ли rbinding все data tables наиболее эффективным способом выполнения функции mean? Спасибо!

1 Ответ

0 голосов
/ 07 мая 2018

Использование:

res <- rbind(dt1,dt2)[, .(perf = mean(perf, na.rm = TRUE),
                          tickers = toString(ticker[!is.na(perf)]))
                      , by = row_names]

дает:

> res
   row_names perf  tickers
1:         1    2       aa
2:         2    1     aapl
3:         3    2     aapl
4:         4    4 aa, aapl
5:         5  NaN

Вместо toString вы также можете использовать paste или paste0 с параметром collapse = ','.


Следуя предложению @Frank, вы можете адаптировать код для:

res <- rbind(dt1,dt2)[, .(perf = if (all(is.na(perf))) NA_real_ else mean(perf, na.rm = TRUE),
                          tickers = if (all(is.na(perf))) NA_character_ else toString(ticker[!is.na(perf)]))
                      , by = row_names]

, что дает:

> res
   row_names perf  tickers
1:         1    2       aa
2:         2    1     aapl
3:         3    2     aapl
4:         4    4 aa, aapl
5:         5   NA       NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...