将第一行数据用作r

时间:2015-08-17 15:38:16

标签: r names

这应该是一个容易解决的问题,但我遇到了麻烦。我有一个脏的数据集,我无法用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,)中的错误:维数不正确

有人可以帮忙吗?

10 个答案:

答案 0 :(得分:5)

header.true <- function(df) {
  names(df) <- as.character(unlist(df[1,]))
  df[-1,]
}

<强>测试

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

答案 1 :(得分:3)

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

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

答案 2 :(得分: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
    

    答案 3 :(得分:1)

    怎么样:

    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
    

    它似乎有用,但也许我错过了一些东西?

    答案 4 :(得分: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,]
    

    答案 5 :(得分:1)

    虽然@sbha已经提供了tidyverse解决方案,但我想保留一个完全可管道使用的dplyr选项。我同意这应该是一个非常有用的功能。

    library(dplyr)
    data.frame(x = c("a", 1, 2, 3), y = c("b", 4, 5, 6)) %>%
      `colnames<-`(.[1, ]) %>%
      .[-1, ]
    

    答案 6 :(得分:0)

    类似于其他一些答案,这是一个dplyr / tidyverse选项:

    library(tidyverse)
    
    names(df) <- df %>% slice(1) %>% unlist()
    df <- df %>% slice(-1)
    

    答案 7 :(得分:0)

    Sam Firke历来有用的软件包janitor具有一个专门为此功能:row_to_names

    他的文档中的示例:

    library(janitor)
    
    x <- data.frame(X_1 = c(NA, "Title", 1:3),
               X_2 = c(NA, "Title2", 4:6))
    x %>%
      row_to_names(row_number = 2)
    

    答案 8 :(得分:0)

    您几乎做到了,只错过了用c调用向量

    colnames(t1)=t1[c(1),]
    

    然后,您可以擦除第一行,因为现在它已加倍

    t1=t1[-c(1),]
    

    答案 9 :(得分:0)

    基于 Pierre L 的回答。有时,当将文档中的第一行拉入数据框时,它最终会被拆分为两行或更多行。这个轻微的修改帮助我解决了这个问题。

    header.true <- function(df) {
      r1 <- as.character(unlist(df[1,]))
      r2 <- as.character(unlist(df[2,]))
      r1.2 <- paste(r1,r2, sep = ".")
      names(df) <- r1.2
      df[-c(1,2),]
    }
    

    测试

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