более быстрый / лучший способ разбить фрейм данных - PullRequest
0 голосов
/ 03 мая 2020

Здравствуйте, мне интересно, есть ли лучший способ сделать это:

# any test and or data frame those ones are just for the exemple
test <- sample(rep(c(TRUE,FALSE),times = 100000),10000)
dat <- data.frame(A = numeric(10000),B=character(10000),C=factor('expl'))

datYes <- dat[test,]
datNo <- dat[!test]

идея состоит в том, чтобы разбить фрейм данных на условие, если условие истинно, данные идут в фрейме данных 1 а если в секунду это ложь путь для data.table, даже если он в настоящее время медленнее, поскольку я скоро переключусь

Ответы [ 2 ]

1 голос
/ 03 мая 2020

data.table определенно намного быстрее и эффективнее, чем стандартный класс data.frame. Вы можете использовать бинарный поиск, чтобы достичь того, что вы имеете в виду.

Ниже я использую набор данных iris, чтобы показать вам, как он работает.

library(data.table)

data("iris")
setDT(iris)

set.seed(1970)
iris[ , test := sample(rep( c(TRUE, FALSE), times = nrow(iris)), nrow(iris)) ]

setkey(iris, test)
iris_true = iris[ .(TRUE) ]
iris_false = iris[ .(FALSE) ]

Создано в 2020-05-03 пакетом prex (v0.3.0)

Вы можете достичь того же самого с помощью :

iris_true = iris[ test == TRUE ]
iris_false = iris[ test == FALSE ]

Помните, что первый метод намного эффективнее и быстрее.

Если позволите, я бы посоветовал вам инвестировать в обучение data.table , отличный пакет с очень четким синтаксисом.

Надеюсь, это помогло.

0 голосов
/ 03 мая 2020

Я не уверен, что это то, что вы хотите

list2env(setNames(split(dat,test),c("datNo","datYes")),envir = .GlobalEnv)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...