从read_csv()中删除空列

时间:2016-06-29 00:19:38

标签: r dplyr readr

我正在尝试使用readr包中的read_csv()读取链接here的csv文件,然后删除空列。

如果我使用read.csv()代替,那么可以使用

轻松删除空列8:12
library(dplyr)    
select(data, 1:7)

但是,当我使用read_csv()函数读取csv文件时,相同的代码会出错;

Error: found duplicated column name: NA, NA, NA, NA

如何删除这些空列?

正确命名空列似乎毫无意义,因此我可以删除它们。我更倾向于使用read_csv()而不是read.csv(),因为它会在以后的分析中让生活变得更轻松。

3 个答案:

答案 0 :(得分:5)

你可以这样做:

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

这将只保留不完全NA的列。

或者,如果你安装了dplyr 0.5,你可以使用新的select_if功能来达到同样的效果:

has_data <- function(x) { sum(!is.na(x)) > 0 }
data <- data %>% select_if(has_data)

答案 1 :(得分: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 

答案 2 :(得分:0)

将csv文件作为数据框加载到R中后,您可以这样做(假设您的数据框被称为dat):

dat = dat[, sapply(dat, function(i) !all(is.na(i)))]

最初,我在想,如果你使用read_csv,你可以这样做:

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

因为read_csv将所有空列的名称设置为NA。但是,这可能很危险。如果您在第一行中有一个没有名称的列,但有一些数据,那么该列的名称也将是NA,并且它也会被删除。