これは非常に簡単な問題であるはずですが、問題があります。 _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、)のエラー:次元数が正しくありません
誰も助けてもらえますか?
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
データを読むときは、skip=1
のread.table
を使用して最初の行を完全に見逃してください。このshouldを使用すると、特にデータ型のデータをクリーンアップするときに、作業が少し楽になります。問題は要因としてエンコードされるデータに起因するため、これは重要です。
その後、nrows=1
のread.table
を使用して、列名を個別に読み込むことができます。
おそらく、データフレーム列のデータ型が要因です。試したコードが機能しなかったのはそのためです。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
どうですか:
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
動作しているようですが、何かが足りないのでしょうか?
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,]
他の回答のいくつかと同様に、ここにdplyr
/tidyverse
オプションがあります:
library(tidyverse)
names(df) <- df %>% slice(1) %>% unlist()
df <- df %>% slice(-1)