按 R 中 csv 中的值选择行并将它们保存在新的 csv 文件中
Posted
技术标签:
【中文标题】按 R 中 csv 中的值选择行并将它们保存在新的 csv 文件中【英文标题】:Select rows by values in a csv in R and save them in a new csv file 【发布时间】:2015-12-16 09:04:33 【问题描述】:我需要从一个大的 csv 文件中选择一些值并使用 R 将它们保存在一个新的文件中。例如,原始表是这样的:
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
【问题讨论】:
【参考方案1】:也许dplyr
包会有所帮助?试试这个:
library("dplyr")
data %>%
filter(INCY %in% c("BE", "IT")) -> new_data
只需保存 new_data。
【讨论】:
【参考方案2】:我们可以试试%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')]
【讨论】:
如何将结果保存到新文件中? @Marta 感谢他的 cmets 以及您的dplyr
方法。【参考方案3】:
这是一个非常基本的问题。我用相对较大的数据集测试了不同的方法。
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
更新:
在比较中包含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
【讨论】:
【参考方案4】:你可以使用read.csv.sql
:
library(sqldf)
read.csv.sql("file.csv", sql = "select * from file where INCY IN ('BE', 'IT')")
虽然这不太可能比使用 readr
或 fread
加载完整表,然后在 R 中设置子集更快。
【讨论】:
以上是关于按 R 中 csv 中的值选择行并将它们保存在新的 csv 文件中的主要内容,如果未能解决你的问题,请参考以下文章