Ответ 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
Это должна быть такая легкая проблема, но у меня проблемы. У меня есть грязный набор данных, который я не мог прочитать с 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
чтобы полностью пропустить первую строку. Это должно сделать жизнь немного легче, когда вы очищаете данные, особенно для типа данных. Это важно, поскольку ваша проблема связана с вашими данными, закодированными как фактор.
Затем вы можете читать имена своих столбцов отдельно с помощью 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)