我正在尝试使用readr包中的read_csv()
读取链接here的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()
,因为它会在以后的分析中让生活变得更轻松。
答案 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
,并且它也会被删除。