[英]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.