web-dev-qa-db-ja.com

rの列名として最初の行データを使用します

これは非常に簡単な問題であるはずですが、問題があります。 _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、)のエラー:次元数が正しくありません

誰も助けてもらえますか?

12
sstww
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
6

データを読むときは、skip=1read.tableを使用して最初の行を完全に見逃してください。このshouldを使用すると、特にデータ型のデータをクリーンアップするときに、作業が少し楽になります。問題は要因としてエンコードされるデータに起因するため、これは重要です。

その後、nrows=1read.tableを使用して、列名を個別に読み込むことができます。

4
MikeRSpencer

おそらく、データフレーム列のデータ型が要因です。試したコードが機能しなかったのはそのためです。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, ] 
    
  • 2番目のオプション
  • 列が要素または文字の場合に機能します:

    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
    mpalanco

    どうですか:

    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
    mattbawn

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

    他の回答のいくつかと同様に、ここにdplyr/tidyverseオプションがあります:

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