использовать данные первой строки как имена столбцов в 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): неправильное количество измерений

Может ли кто-нибудь помочь?

Ответы

Ответ 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

Ответ 2

Сделайте шаг назад, когда вы читаете данные, используйте skip=1 в read.table чтобы полностью пропустить первую строку. Это должно сделать жизнь немного легче, когда вы очищаете данные, особенно для типа данных. Это важно, поскольку ваша проблема связана с вашими данными, закодированными как фактор.

Затем вы можете читать имена своих столбцов отдельно с помощью nrows=1 в read.table.

Ответ 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

Ответ 4

Как насчет:

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

Кажется, работает, но, может быть, я что-то упустил?

Ответ 5

Использование 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,]

Ответ 6

Подобно некоторым другим ответам, здесь есть опция dplyr/tidyverse:

library(tidyverse)

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