从read_csv()中删除空列

从read_csv()中删除空列,r,dplyr,readr,R,Dplyr,Readr,我试图从readr包中读取使用read_csv链接的csv文件,然后删除空列 如果改用read.csv,那么可以使用 library(dplyr) select(data, 1:7) 但是,当我使用read_csv函数读取csv文件时,相同的代码会给出一个错误 Error: found duplicated column name: NA, NA, NA, NA 如何删除这些空列 正确命名空列以便删除它们似乎是没有意义的。我更喜欢使用read_csv而不是read.csv,因为它可以

我试图从readr包中读取使用read_csv链接的csv文件,然后删除空列

如果改用read.csv,那么可以使用

library(dplyr)    
select(data, 1:7)
但是,当我使用read_csv函数读取csv文件时,相同的代码会给出一个错误

Error: found duplicated column name: NA, NA, NA, NA
如何删除这些空列

正确命名空列以便删除它们似乎是没有意义的。我更喜欢使用read_csv而不是read.csv,因为它可以让以后的分析更加轻松。

您可以:

data <- data[,apply(data, 2, function(x) { sum(!is.na(x)) > 0 })]
你可以做:

data <- data[,apply(data, 2, function(x) { sum(!is.na(x)) > 0 })]
我不确定read_csv,但如果您使用read.csv,将不需要的列的colClasses指定为NULL,您将在根据需要调整rep调用中的整数后得到所需的结果:

read.csv( file = [yourfile],
        colClasses = c( rep("character",3), rep("NULL",5) )
)
上面只返回前3列,忽略以下5列

备选答案: 你试过fread吗?它有一个select参数,可能对您有用,例如:

fread( [filename], select = c(1:3) )
它还有比read.csv和read_csv快很多的优点。这是一个速度测试,我有一个特定的文件:

microbenchmark::microbenchmark( 
fread = {rangerdata2 <- data.table::fread( filename, select = c(1:3) )}, 
read.csv = {rangerdata2 <- utils::read.csv( file = filename )[,1:3]}, 
read_csv = {rangerdata2 <- readr::read_csv( file = filename )[,1:3]}, 
times = 1000)

Unit: milliseconds
 expr      min       lq      mean    median        uq      max neval cld
 fread    1.22161  1.32841  1.464724  1.377178  1.442089  14.57102  1000 a  
 read.csv 18.25402 18.55992 19.664278 18.772855 19.565684 34.87589  1000   c
 read_csv 13.43166 13.76704 14.615746 13.975987 14.608822 33.36244  1000  b 
我不确定read_csv,但如果您使用read.csv,将不需要的列的colClasses指定为NULL,您将在根据需要调整rep调用中的整数后得到所需的结果:

read.csv( file = [yourfile],
        colClasses = c( rep("character",3), rep("NULL",5) )
)
上面只返回前3列,忽略以下5列

备选答案: 你试过fread吗?它有一个select参数,可能对您有用,例如:

fread( [filename], select = c(1:3) )
它还有比read.csv和read_csv快很多的优点。这是一个速度测试,我有一个特定的文件:

microbenchmark::microbenchmark( 
fread = {rangerdata2 <- data.table::fread( filename, select = c(1:3) )}, 
read.csv = {rangerdata2 <- utils::read.csv( file = filename )[,1:3]}, 
read_csv = {rangerdata2 <- readr::read_csv( file = filename )[,1:3]}, 
times = 1000)

Unit: milliseconds
 expr      min       lq      mean    median        uq      max neval cld
 fread    1.22161  1.32841  1.464724  1.377178  1.442089  14.57102  1000 a  
 read.csv 18.25402 18.55992 19.664278 18.772855 19.565684 34.87589  1000   c
 read_csv 13.43166 13.76704 14.615746 13.975987 14.608822 33.36244  1000  b 

一旦您的csv文件作为数据帧加载到R中,您可以假设您的数据帧名为dat:

最初,我认为如果您使用read_csv,您可以:

dat = dat[, !is.na(names(dat))]

因为read_csv将所有空列的名称设置为NA。然而,这可能是危险的。如果第一行中有一列没有名称,但有一些数据,则该列的名称也将是NA,并且也将被删除

一旦您的csv文件作为数据帧加载到R中,您可以假设您的数据帧名为dat:

最初,我认为如果您使用read_csv,您可以:

dat = dat[, !is.na(names(dat))]

因为read_csv将所有空列的名称设置为NA。然而,这可能是危险的。如果第一行中有一列没有名称,但有一些数据,则该列的名称也将是NA,并且也将被删除

在这种情况下,任何不使用此数据的原因在这种情况下,任何不使用此数据对fread、read_csv和read.csv进行有效比较的原因,都需要使用更大的文件。对于一个小文件,您主要是比较调用函数所涉及的任何开销,而不是读取速度,并且这三个函数的速度都足够快,可以忽略差异。我用一个50 MB的文件测试了这三个函数,100万行7列仍然相对较小,但足够大,时间是以秒为单位的:fread:0.78,read_csv:1.05,read.csv:15.1。我在一台速度更快的计算机上用一个1000万行11列1.8 GB的csv文件测试了fread和read_csv。基于5次秒重复的中位数计时:fread:21.3,read_csv:23.0。这很公平,但对于我最常使用的文件来说,这些时间是相关的。是的,即使总数很小,使任何改进都显得微不足道。如果开销对总时间的贡献很大,那对我来说很重要。感谢您的测试,非常有趣。要对fread、read_csv和read.csv进行有效比较,您需要使用更大的文件。对于一个小文件,您主要是比较调用函数所涉及的任何开销,而不是读取速度,并且这三个函数的速度都足够快,可以忽略差异。我用一个50 MB的文件测试了这三个函数,100万行7列仍然相对较小,但足够大,时间是以秒为单位的:fread:0.78,read_csv:1.05,read.csv:15.1。我在一台速度更快的计算机上用一个1000万行11列1.8 GB的csv文件测试了fread和read_csv。基于5次秒重复的中位数计时:fread:21.3,read_csv:23.0。这很公平,但对于我最常使用的文件来说,这些时间是相关的。是的,即使总数很小,使任何改进都显得微不足道。如果开销对总时间的贡献很大,那对我来说很重要。谢谢你的测试,非常有趣。这应该是一个内置的了。2年后?这应该是一个内置的了。两年后?