首页 文章

使用第一行数据作为r中的列名

提问于
浏览
8

这应该是一个容易的问题,但我遇到了麻烦 . 我有一个脏数据集,我无法用 header=T 读取它 . 在我阅读并清理它之后,我想使用现在的第一行数据作为列名 . 我在stackoverflow上尝试了多种方法但没有成功 . 可能是什么问题呢?清理后,数据集 t1 应该如下所示:

V1    V2  V3  V4  V5
1   col1    col2    col3    col4
2   row1    2   4   5   56
3   row2    74  74  3   534
4   row3    865 768 8   7
5   row4    68  86  65  87

我试过了: colnames(t1)=t1[1,] . 什么都没发生 .

我试过了: names(t1)=ti[1,] ,什么都没发生 .

我试过了: lapply(t1, function(x) {names(x)<-x[1,]; x})

它返回一条错误消息:

[.default(x,1,)中的错误:维度数不正确

有人可以帮忙吗?

5 回答

  • 3

    退一步,当您读取数据时,请使用 read.table 中的 skip=1 完全错过第一行 . 当您清理数据时,这应该可以使生活更轻松,特别是对于数据类型 . 这是关键,因为您的问题源于您的数据被编码为因素 .

    然后,您可以使用 read.table 中的 nrows=1 分别读取列名称 .

  • 3

    可能数据帧列的数据类型是因子 . 这就是为什么您尝试的代码不起作用的原因,您可以使用 str(df) 进行检查:

    • 第一个选项

    使用参数stringsAsFactors = FALSE导入数据时:

    df <- read.table(text =  "V1    V2  V3  V4  V5
                            col1    col2    col3    col4 col5
                            row1    2   4   5   56
                            row2    74  74  3   534
                            row3    865 768 8   7
                            row4    68  86  65  87", header = TRUE, 
                            stringsAsFactors = FALSE )
    

    然后你可以使用你的第一次尝试,然后删除你的第一行,如果你愿意:

    colnames(df) <- df[1,]
    df <- df[-1, ]
    
    • 第二个选项

    如果您的列是因子或字符,它将起作用:

    names(df) <- lapply(df[1, ], as.character)
    df <- df[-1,]
    

    输出:

    col1 col2 col3 col4 col5
    2 row1    2    4    5   56
    3 row2   74   74    3  534
    4 row3  865  768    8    7
    5 row4   68   86   65   87
    
  • 0
    header.true <- function(df) {
      names(df) <- as.character(unlist(df[1,]))
      df[-1,]
    }
    

    Test

    df1 <- data.frame(c("a", 1,2,3), c("b", 4,5,6))
    header.true(df1)
      a b
    2 1 4
    3 2 5
    4 3 6
    
  • 5

    怎么样:

    my.names <- t1[1,]
    
    colnames(t1) <- my.names
    

    即具体将行命名为变量?

    使用以下代码:

    namex <-c("col1","col2","col3","col4")
    row1 <- c(2, 4, 5, 56)
    row2 <- c(74, 73, 3, 534)
    row3 <- c(865, 768, 8, 7)
    row4 <- c(68, 58, 65, 87)
    
    t1 <- data.frame(namex, row1, row2, row3, row4)
    t1 <- t(t1)
    
    my.names <- t1[1,]
    
    colnames(t1) <- my.names
    

    它似乎有用,但也许我错过了什么?

  • 1

    使用data.table:

    library(data.table)
    
    namex <-c("col1","col2","col3","col4")
    row1 <- c(2, 4, 5, 56)
    row2 <- c(74, 73, 3, 534)
    row3 <- c(865, 768, 8, 7)
    row4 <- c(68, 58, 65, 87)
    
    t1 <- data.table(namex, row1, row2, row3, row4)
    t1 <- data.table(t(t1))
    
    setnames(t1, as.character(t1[1,]))
    t1 <- t1[-1,]
    

相关问题