1

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

如果我read.csv()改为使用,则可以使用 8:12 轻松删除空列

library(dplyr)    
select(data, 1:7)

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

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

如何删除这些空列?

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

4

3 回答 3

6

你可以这样做:

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)
于 2016-06-29T00:40:27.410 回答
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并且它也会被删除。

于 2016-06-29T01:44:09.560 回答
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 
于 2016-06-29T01:14:47.537 回答