R:如何将行名称设置为 read.table() 中的最后一列

R: How to set the row names to the last column in read.table()

如果行名在第一列,我通常使用 dat = read.table(filename, row.names=1)。当行名在文件的最后一列时,对应的调用是什么?我试过 dat = read.table(filename, row.names=ncol(dat)) 但这没有按预期工作,因为 dat 变量还不存在。

tibble 中有一个函数可以做到这一点 column_to_rownames

dat <- read.table(filename)
dat <- tibble::column_to_rownames(dat, var = "target")

这提供了使用列名的好处,源中列的顺序不太相关。

base R 选项是使用 count.fields

read.table('filename.csv', sep=",", 
       row.names = count.fields('filename.csv', sep=",")[1], header = TRUE)
#   col1 col2
#C    1    A
#F    2    B
#D    3    C
#G    4    D

数据

df1 <- data.frame(col1 = 1:2, col2 = LETTERS[1:4],
           col3 = c('C', 'F', 'D', 'G'), stringsAsFactors=FALSE)
write.csv(df1, 'filename.csv', quote = FALSE, row.names = FALSE)

我个人只是将 header 行剪切并粘贴到顶部的正确位置。然后,与数据管道人员讨论为什么 header 出现在文件底部。如果你想要一个 R 解决方案,我可以提供以下代码。

我认为使用 read.tableread.csv 没有什么好的方法可以做到这一点。这些函数设计为 header 位于文件顶部。您可以尝试以下方法:

library(readr)

df <- NULL
cols <- list()
line <- 0L
input <- "start"
while (input != "") {
    line <- line + 1L
    input <- read_lines( file, skip = line - 1L, n_max = 1L )
    cols <- strsplit(input, " ")
    df <- rbind(df, cols)
}

# remove the last row, which is really just the header names
df <- head(df, -1)

# now take the very last line and assign the names
names(df) <- as.character(cols)