2015-08-17 2 views
2

Это должна быть такая легкая проблема, но у меня проблемы. У меня есть грязный набор данных, который я не мог прочитать с помощью header=T. После того, как я прочитал и очистил его, я хотел бы использовать данные первой строки в качестве имени столбца. Я пробовал несколько методов в stackoverflow без успеха. В чем может быть проблема? Набор данных t1 должен выглядеть следующим образом после очистки:использовать данные первой строки как имена столбцов в r

 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 (х, 1): неправильное число измерений

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

+0

Глядя на ваши данные, у вас есть пробелы в некоторых столбцах ? попробуйте str (t1 [1,]) и посмотрите, делает ли он то, что вы ожидаете. – MikeRSpencer

+0

Не могли бы вы вставить в первые несколько строк файла? –

ответ

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 
0

Как о:

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 

Это похоже на работу, но, возможно, я что-то не хватает?

+0

да, вам не хватает двух шагов, сначала вам нужно удалить первую строку, которую вы используете в качестве имен столбцов, и преобразовать 'matrix' в' data.frame' –

2

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

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

1

Возможно, тип данных столбцов фрейма данных является факторами.Поэтому код, который вы пытались не работает, вы можете проверить его с помощью 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 
    
    Смежные вопросы