使用 read.csv 跳过 r 中的最后一列

Skipping last column in r with read.csv

我在那个 post read.csv and skip last column in R but did not find my answer, and try to check directly in Answer ... but that's not the right way (thanks mjuarez 是因为我花时间让我回到正轨。

原来的问题是:

I have read several other posts about how to import csv files with read.csv but skipping specific columns. However, all the examples I have found had very few columns, and so it was easy to do something like:

 columnHeaders <- c("column1", "column2", "column_to_skip")
 columnClasses <- c("numeric", "numeric", "NULL")
 data <- read.csv(fileCSV, header = FALSE, sep = ",", col.names = 
 columnHeaders, colClasses = columnClasses)

所有答案都很好,但不适用于我打算做的事情。所以我问自己和其他人:

And in one function, does data <- read_csv(fileCSV)[,(ncol(data)-1)] could work?

我已经尝试在 R 的一行中进入 data,前 6 列中的所有 5 列,而不是最后一列。为此,我想在列数中使用“-”,您认为这可能吗?我该怎么做?

谢谢!

在 base r 中,它必须是 2 步操作。示例:

> data <- read.csv("test12.csv")
> data
# 3 columns are returned
          a b c
1 1/02/2015 1 3
2 2/03/2015 2 4

# last column is excluded 
> data[,-ncol(data)]
          a b
1 1/02/2015 1
2 2/03/2015 2

不能在基数 r 中写 data <- read.csv("test12.csv")[,-ncol(data)]

但是如果您知道 csv 中的最大列数(在我的例子中是 3),那么可以写:

df <- read.csv("test12.csv")[,-3]
df
          a b
1 1/02/2015 1
2 2/03/2015 2

不可能在一行中完成,因为在您调用它时 data 变量尚未初始化。所以命令 ncol(data) 会触发错误。

您需要使用两行代码首先将数据加载到 data 变量中,然后使用 data[,-ncol(data)]data[,1:(ncol(data)-1)] 删除最后一列。

首先处理作业的右侧,因此问题中的这一行:

data <- read.csv(fileCSV)[,(ncol(data)-1)]

试图在定义之前使用 data。还要注意上面所说的是只取倒数第二个字段。要获取除最后一个字段之外的所有字段:

data <- read.csv(fileCSV)
data <- data[-ncol(data)]

如果您知道最后一个字段的名称,比如说它是 lastField,那么这就可以工作,并且与上面的代码不同,它不会读取整个文件然后删除最后一个字段,而是只读取字段除了最后一个。也只有一行代码。

read.csv(fileCSV, colClasses = c(lastField = "NULL"))

如果您不知道最后一个字段的名称但知道有多少个字段,比如 n,那么以下任何一个都可以:

read.csv(fileCSV)[-n]

read.csv(fileCSV, colClasses = replace(rep(NA, n), n, "NULL"))

另一种不先读取最后一个字段的方法是先读取文件头和第一行计算字段数(假设所有记录的编号相同),然后重新读取文件使用那个。

n <- ncol(read.csv(fileCSV, nrows = 1))

利用涉及 n.

的前两个语句之一

不是单个函数,而是至少一行,使用 dplyr(免责声明:我从不使用 dplyrmagrittr,因此必须存在使用这些的更优化的解决方案库)

library(dplyr)
dat = read.table(fileCSV) %>% select(., which(names(.) != names(.)[ncol(.)]))