从read_csv()中删除空列
我试图从readr包中读取使用read_csv链接的csv文件,然后删除空列 如果改用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,因为它可以
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年后?这应该是一个内置的了。两年后?