От новичка до гуру: Курсы программирования на CyberDuff

Как прочитать несколько строк файла в одной строке фрейма данных

У меня есть файл данных, в котором отдельные образцы разделены пустой строкой, а каждое поле находится в отдельной строке:

age 20
weight 185
height 72

age 87
weight 109
height 60

age 15
weight 109
height 58

...

Как я могу прочитать этот файл в фреймворке данных, чтобы каждая строка представляла образец со столбцами возраста, веса и роста?

    age    weight    height

1   20      185        72  
2   87      109        60
3   15      109        58
...
29.01.2013

  • age, weight и т. д. являются значениями или похожими на них: age 20 и в следующей строке _4 _...? 29.01.2013
  • Исправлен вопрос, теперь это должно быть ясно из примера. 29.01.2013
  • грррр ... это не место для этого 29.01.2013

Ответы:


1

@ user1317221_G показал подход, который я бы использовал, но прибег к загрузке дополнительного пакета и явному созданию групп. Группы (переменная ID) - это ключ к тому, чтобы любой ответ типа reshape работал. Матричные ответы не имеют этого ограничения.

Вот близкий подход в базе R:

mydf <- read.table(header = FALSE, stringsAsFactors=FALSE, 
                   text = "age 20
                   weight 185
                   height 72

                   age 87
                   weight 109
                   height 60

                   age 15
                   weight 109
                   height 58
                   ")

# Create your id variable
mydf <- within(mydf, {
  id <- ave(V1, V1, FUN = seq_along)
})

С переменной id ваше преобразование очень просто:

reshape(mydf, direction = "wide", 
        idvar = "id", timevar="V1")
#   id V2.age V2.weight V2.height
# 1  1     20       185        72
# 4  2     87       109        60
# 7  3     15       109        58

Or:

# Your ids become the "rownames" with this approach
as.data.frame.matrix(xtabs(V2 ~ id + V1, mydf))
#   age height weight
# 1  20     72    185
# 2  87     60    109
# 3  15     58    109
29.01.2013
  • +1 ave - хороший выбор, и мне нравится xtabs решение, о котором я всегда забываю. 29.01.2013

  • 2

    Чтобы расширить ответ @ BlueMagister, вы можете использовать сканирование с некоторыми параметрами, чтобы прочитать это непосредственно в списке, а затем преобразовать список во фрейм данных:

    tmp <- scan(text = "
    age     20
    weight  185
    height  72
    
    age     87
    weight  109
    height  60
    
    age     15
    weight  109
    height  58", multi.line=TRUE, 
      what=list('',0,'',0,'',0), 
      blank.lines.skip=TRUE)
    
    mydf <- as.data.frame( tmp[ c(FALSE,TRUE) ] )
    names(mydf) <- sapply( tmp[ c(TRUE,FALSE) ], '[', 1 )
    

    Это предполагает, что переменные в записи всегда находятся в одном и том же порядке.

    29.01.2013

    3

    Другое решение

    data <- readLines('c:\\relatorios\\bla.txt') # Read the data
    data <- data[data != ''] # Remove the white lines
    names <- unique(gsub('[0-9]*','',data)) # Get the names
    data <- matrix(as.real(gsub('[^0-9]*','',data)),ncol=3,byrow=T) # Create matrix
    colnames(data) <- names # Set the names
    
    29.01.2013

    4

    Вот кое-что, что я пробовал с scan:

    ##substitute text with file depending on your input
    ##read in three strings separated by spaces, multi-line input
    y <- scan(text=x,what=list(character(),character(),character())
      ,sep="\n",multi.line=TRUE)
    ##combine into a matrix of strings
    y <- do.call(cbind,y)
    #     [,1]     [,2]         [,3]       
    #[1,] "age 20" "weight 185" "height 72"
    #[2,] "age 87" "weight 109" "height 60"
    #[3,] "age 15" "weight 109" "height 58"
    ##set column names based on text from the first row
    colnames(y) <- regmatches(y[1,],regexpr("^\\w+",y[1,]))
    ##remove non-numeric characters
    y <- gsub("\\D+","",y)
    ##convert to number format, preserving matrix structure
    y <- apply(y,2,as.numeric)
    ##convert to data frame (if necessary)
    y <- data.frame(y)
    
    29.01.2013

    5

    Если ваш исходный файл имеет эти три переменные полностью вниз, один простой способ - просто прочитать файл в виде двух столбцов (имена в первом, числа во втором), а затем превратить второй столбец в матрицу. Если я поймаю df из ответа user1317221_G,

    matrix(df$V2,ncol=3,byrow=TRUE)
         [,1] [,2] [,3]
    [1,]    1    1    6
    [2,]    2    7    2
    [3,]    4    8    9
    

    Добавление имен строк и / или столбцов тривиально. Извините, что получил порядок столбцов "возраст, вес, рост" :-)

    29.01.2013

    6
  • +1. Этот подход тоже пришел мне в голову. Мне не нравится жестко кодировать переменную ID, как вы. 29.01.2013
  • @AnandaMahto Ваше право, хотя мы могли бы сделать еще один шаг к автоматизации с помощью: df$ID <- rep(1:(length(df[,1])/3), each=3) 29.01.2013
  • Это больше походит на это! Хорошая альтернатива. 29.01.2013
  • Новые материалы

    5 простых концепций Python, ставших сложными
    #заранее извините 1) Переменные x = 4 y = 5 Переменная в Python — это символическое представление объекта. После присвоения некоторого объекта переменной Python мы приобретаем..

    «Освоение вероятности: изучение совместной, предельной, условной вероятности и теоремы Байеса —…
    Виды вероятности: Совместная вероятность Предельная вероятность Условная вероятность Диаграмма Венна в вероятностях: В “Set Theory” мы создаем диаграмму Венна...

    Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
    Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

    Отслеживание состояния с течением времени с дифференцированием снимков
    Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..

    Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
    Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..

    Игра в прятки с данными
    Игра в прятки с данными Я хотел бы, чтобы вы сделали мне одолжение и ответили на следующие вопросы. Гуглить можно в любое время, здесь никто не забивается. Сколько регионов в Гане? А как..

    «Раскрытие математических рассуждений с помощью Microsoft MathPrompter и моделей больших языков»
    TL;DR: MathPrompter от Microsoft показывает, как использовать математические рассуждения с большими языковыми моделями; 4-этапный процесс для улучшения доверия и рассуждений в математических..