簡體   English   中英

使用第一行數據作為 r 中的列名

[英]use first row data as column names in r

我有一個臟數據集,我無法使用header = T讀取它。 在我閱讀並清理它之后,我想使用現在的第一行數據作為列名。 我在 Stack Overflow 上嘗試了多種方法都沒有成功。 可能是什么問題呢?

清理后的數據集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}) 它返回一條錯誤消息:

     Error in `[.default`(x, 1, ) : incorrect number of dimensions

有人可以幫忙嗎?

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)
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

可能,數據框列的數據類型是因子。 這就是您嘗試的代碼不起作用的原因,您可以使用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
    

    退后一步,當您讀取數據時,請在read.table使用skip=1完全錯過第一行。 當您清理數據時,這應該會讓生活更輕松一些,尤其是對於數據類型。 這是關鍵,因為您的問題源於您的數據被編碼為因子。

    然后,您可以在read.table使用nrows=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
    

    它似乎有效,但也許我遺漏了什么?

    雖然@sbha 已經提供了一個tidyverse解決方案,但我想留下一個完全可管道化的dplyr選項。 我同意這應該是一個非常有用的功能。

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

    與其他一些答案類似,這里有一個dplyr / tidyverse選項:

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

    使用數據表:

    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,]
    

    你幾乎做到了,只是錯過了用 c 調用向量

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

    然后你可以擦除第一行,因為現在它翻了一番

    t1=t1[-c(1),]
    

    基於 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
    

    暫無
    暫無

    聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

     
    粵ICP備18138465號  © 2020-2024 STACKOOM.COM