Это очень простой вопрос. Я тестировал разные подходы с относительным большим набором данных.
dplyr
является самым быстрым. %in%
+ subset
самый медленный.
text1 <- "
CODINV2 INCY APPLID
701 BE 15831845
3103 DE 17301283
701 BE 16428865
7802 NL 16285035
8501 IT 15725319
8502 IT 16428857"
df <- read.table(text=text1, head=T, as.is=T)
df1 <- do.call(rbind, lapply(1:10000, function(x)df))
library(dplyr)
library(microbenchmark)
microbenchmark(
akrun = subset(df1, INCY %in% c('BE', 'IT')),
venyao = df1[df1$INCY=="BE"|df1$INCY=="IT", ],
me = df1[df1$INCY %in% c("BE", "IT"), ],
marta = df1 %>% filter(INCY %in% c("BE", "IT")),
times = 10
)
# Unit: milliseconds
# expr min lq mean median uq max neval cld
# akrun 5.480150 5.609124 6.396097 5.741517 7.560138 7.757532 10 c
# venyao 5.209888 5.308072 5.873945 5.401295 5.711413 7.893688 10 bc
# me 4.769260 4.872918 5.331644 4.910891 5.179100 7.097614 10 b
# marta 2.422432 2.563379 2.643739 2.611616 2.766588 2.866825 10 a
UPDATE:
включают в сравнении data.table
. data.table
быстрей в любом состоянии. Я смущен, что dplyr
- самый медленный подход.
library(dplyr)
library(data.table)
library(microbenchmark)
microbenchmark(
akrun = subset(df1, INCY %in% c('BE', 'IT')),
venyao = df1[df1$INCY=="BE"|df1$INCY=="IT", ],
me = df1[df1$INCY %in% c("BE", "IT"), ],
marta = df1 %>% filter(INCY %in% c("BE", "IT")),
akrun2 = setDT(df1, key='INCY')[c('BE', 'IT')],
times = 10
)
# Unit: milliseconds
# expr min lq mean median uq max neval cld
# akrun 3.154533 3.171639 3.825090 3.402216 3.641688 5.915990 10 c
# venyao 2.677642 2.761456 3.087618 2.772061 2.969455 5.485966 10 bc
# me 2.388564 2.428248 2.571111 2.505905 2.757010 2.884614 10 ab
# marta 5.026180 5.081942 5.455929 5.208863 5.466808 7.373691 10 d
# akrun2 1.836410 1.919541 1.964562 1.955804 1.985567 2.213408 10 a
Как я могу сохранить результаты в новом файле? –
write.csv (new_data_set, "C:/User/.......") – Marta
@Marta Спасибо за комментарии и плюс один за ваш метод 'dplyr'. – akrun