2015-12-16 5 views
0

Мне нужно выбрать некоторые значения из большого файла csv и сохранить их в новом, используя R. Например, исходная таблица - это :Выберите строки по значениям в csv в R и сохраните их в новом файле csv

CODINV2 INCY APPLID 
701  BE 15831845 
3103  DE 17301283 
701  BE 16428865 
7802  NL 16285035 
8501  IT 15725319 
8502  IT 16428857 

Я хотел бы выбрать только строки с значениями INCY «BE» и «IT». Новый файл CSV должен выглядеть так:

CODINV2 INCY APPLID 
701  BE 15831845 
701  BE 16428865 
8501  IT 15725319 
8502  IT 16428857 

ответ

4

Мы можем попробовать %in%

subset(df1, INCY %in% c('BE', 'IT')) 
# CODINV2 INCY APPLID 
#1  701 BE 15831845 
#3  701 BE 16428865 
#5 8501 IT 15725319 
#6 8502 IT 16428857 

Или с data.table

library(data.table) 
setDT(df1, key='INCY')[c('BE', 'IT')] 
+0

Как я могу сохранить результаты в новом файле? –

+1

write.csv (new_data_set, "C:/User/.......") – Marta

+0

@Marta Спасибо за комментарии и плюс один за ваш метод 'dplyr'. – akrun

5

Может dplyr пакет поможет? Попробуйте следующее:

library("dplyr") 

data %>% 
    filter(INCY %in% c("BE", "IT")) -> new_data 

И просто сохраните new_data.

2

Это очень простой вопрос. Я тестировал разные подходы с относительным большим набором данных.

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 
1

Вы можете использовать read.csv.sql:

library(sqldf) 
read.csv.sql("file.csv", sql = "select * from file where INCY IN ('BE', 'IT')") 

Хотя вряд ли это будет быстрее, чем при использовании readr или fread, чтобы загрузить полную таблицу, а затем в Подменю R.