2017-02-22 8 views
1

Мне известно о некоторых пакетах в R для интеллектуального анализа текста, таких как tm, но я не могу использовать его для своей задачи. У меня есть текстовый файл, который имеет что-то данные, как это:Преобразование данных pivot

452924301037 
    5May2014 
     John 
    7May2014 
     Mark 
     Sam 
452924302789 
    6May2014 
     Bill 

Я хочу вышеуказанные данные в кадре данных, как что-то вроде этого:

UserID, Date, Names 
452924301037,5May2014,John 
452924301037,7May2014,Mark Sam 
452924302789,6May2014,Bill 

Как я могу сделать это в R?

Пример 2:

Входной текстовый файл:

452924301037 
    5May2014 
     John 
      Cricket 
      Football 
    7May2014 
     Mark 
      Hockey 
452924302789 
    6May2014 
     Bill 
      Billiards 

И я хочу, чтобы настроить кадр данных, как показано ниже:

Game, Player, Date, UserID 
Cricket, John, 5May2014, 452924301037 
Football, John, 5May2014, 452924301037 
Hockey, Mark, 7May2014, 452924301037 
Billiards, Bill, 6May2014, 452924302789 
+0

где находится '52924301037'? –

+0

Обновлено. То же, что и родительский идентификатор пользователя – AYa

+0

Вам необходимо сделать его воспроизводимым. Используйте 'dput' – Sotos

ответ

2

Возможное решение с использованием data.table и zoo:

# read the textfile 
txt <- readLines('textlines.txt') 

# load the needed packages 
library(zoo) 
library(data.table) 

# convert the text to a data.table (an enhanced form of a dataframe) 
DT <- data.table(txt = txt) 

# extract the info into new columns 
DT[grepl('\\d+{8,}', txt), User_id := grep('\\d+{8,}', txt, value = TRUE) 
    ][grepl('\\D+{3}\\d+{4}', txt), Date := txt 
    ][, (c('User_id','Date')) := lapply(.SD, na.locf, na.rm = FALSE), .SDcols = 2:3 
     ][txt!=User_id & txt != Date, .(Names = paste0(txt, collapse = ' ')), by = .(User_id, Date)] 

, который дает:

 user_id  date Names 
1: 452924301037 5May2014  John 
2: 452924301037 7May2014 Mark Sam 
3: 452924302789 6May2014  Bill 

Чтобы увидеть, что каждый шаг делает, запустить следующий код:

# extract the user_id's 
DT[grepl('\\d+{8,}', txt), User_id := grep('\\d+{8,}', txt, value = TRUE)][] 
# extract the dates 
DT[grepl('\\D+{3}\\d+{4}', txt), Date := txt][] 
# fill the NA-values of 'User_id' and 'Date' with na.locf from the zoo package 
DT[, (c('User_id','Date')) := lapply(.SD, na.locf, na.rm = FALSE), .SDcols = 2:3][] 
# filter out the rows where the 'txt'-column has either a 'User_id' or a 'Date' 
# collapse the names into one string by 'User_id' and 'Date' 
DT[txt != User_id & txt != Date, .(Names = paste0(txt, collapse = ' ')), by = .(User_id, Date)][] 

Для добавленного 2 Например, вы могли бы сделать:

DT <- data.table(txt = trimws(txt)) 

DT[grepl('\\d+{8,}', txt), User_id := grep('\\d+{8,}', txt, value = TRUE) 
    ][grepl('\\D+{3}\\d+{4}', txt), Date := txt 
    ][, (c('User_id','Date')) := lapply(.SD, na.locf, na.rm = FALSE), .SDcols = 2:3 
     ][txt!=User_id & txt != Date 
     ][, Name := txt[1], by = .(User_id, Date) 
      ][Name != txt] 

который дает:

  txt  User_id  Date Name 
1: Cricket 452924301037 5May2014 John 
2: Football 452924301037 5May2014 John 
3: Hockey 452924301037 7May2014 Mark 
4: Billiards 452924302789 6May2014 Bill 
+0

Можете ли вы помочь мне с небольшим вариантом исходного вопроса? Я отредактировал вопрос. Я пытаюсь построить кадр данных, в котором каждый ребенок должен иметь одну строку в кадре данных, и это объекты столбца, поступающие из их соответствующих родительских данных. – AYa

+0

@AYa см. Обновленный ответ – Jaap

+0

Я пробовал подход для первого вопроса и на 'DT [txt! = User_id & txt! = Date,. (Names = paste0 (txt, collapse = '')), by =. (User_id, Date)] [] 'Я получаю' Пустое data.table (0 строк) из 3 cols: User_id, Date, Names' в консоли. Спасибо за подход к второму вопросу. Я попробую это. – AYa

Смежные вопросы