按 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.tabledata.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')")

虽然这不太可能比使用 readrfread 加载完整表,然后在 R 中设置子集更快。

【讨论】:

以上是关于按 R 中 csv 中的值选择行并将它们保存在新的 csv 文件中的主要内容,如果未能解决你的问题,请参考以下文章

R:按组计算多个相关性(并将输出保存到 csv 文件)

根据 CSV 文件行中的值确定数据类型

在 R 中处理大型 csv 文件时避免挂断

如何迭代数据框中的行以检测不同的单词并将其保存在新列中?

我们如何逐行打印字符并将其保存到 PLSQL 中的 csv 或文本文件

如何通过不同的 csv 文件迭代选择的操作并将结果输出到新的 csv 文件