rbindlist только элементы, которые удовлетворяют условию - PullRequest
1 голос
/ 05 июля 2019

У меня большой список.Некоторые элементы являются строками, а некоторые элементы являются data.tables.Я хотел бы создать большой data.table, но только привязать элементы data.tables.

Я знаю, как сделать это в цикле for, но я ищу что-то более эффективное, так как мои данные большие, и мне нужно что-то быстрое.

Спасибо!

library(data.table)

DT1 = data.table(
  ID = c("b","b","b","a","a","c"),
  a = 1:6
)

DT2 = data.table(
  ID = c("b","b","b","a","a","c"),
  a = 11:16
)

list<- list(DT1,DT2,"string")

Я ищу результат, похожий на результат, но так как у меня много записей, я не могу сделать это так.

rbind(DT1, DT2)

Ответы [ 3 ]

2 голосов
/ 05 июля 2019

Filter data.table и rbind

library(data.table)
rbindlist(Filter(is.data.table, list_df))

#    ID  a
# 1:  b  1
# 2:  b  2
# 3:  b  3
# 4:  a  4
# 5:  a  5
# 6:  c  6
# 7:  b 11
# 8:  b 12
# 9:  b 13
#10:  a 14
#11:  a 15
#12:  c 16

Данные

list_df <- list(DT1,DT2,"string")
1 голос
/ 05 июля 2019

Мы можем использовать keep от purrr с bind_rows

library(tidyverse)
keep(list, is.data.table) %>%
   bind_rows
#    ID  a
# 1:  b  1
# 2:  b  2
# 3:  b  3
# 4:  a  4
# 5:  a  5
# 6:  c  6
# 7:  b 11
# 8:  b 12
# 9:  b 13
#10:  a 14
#11:  a 15
#12:  c 16

Или используя rbindlist с keep

rbindlist(keep(list, is.data.table))
0 голосов
/ 05 июля 2019

Использование sapply() для генерации логического вектора для подмножества вашего list

rbindlist(list[sapply(list, is.data.table)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...