как чистить нерегулярные строки и организовывать их в информационный блок в правом столбце - PullRequest
1 голос
/ 30 апреля 2020

У меня есть две длинные строки, которые выглядят так в векторе:

x <- c("Job Information\n\nLocation: \n\n\nScarsdale, New York, 10583-3050, United States \n\n\n\n\n\nJob ID: \n53827738\n\n\nPosted: \nApril 22, 2020\n\n\n\n\nMin Experience: \n3-5 Years\n\n\n\n\nRequired Travel: \n0-10%",
       "Job Information\n\nLocation: \n\n\nGlenview, Illinois, 60025, United States \n\n\n\n\n\nJob ID: \n53812433\n\n\nPosted: \nApril 21, 2020\n\n\n\n\nSalary: \n$110,000.00 - $170,000.00 (Yearly Salary)")

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

#View(df)
     Location     Job ID    Posted      Min Experience   Required Travel   Salary
[1] Scarsdale,... 53827738  April 22... 3-5 Years         0-10%             NA
[2] Glenview,...  53812433  April 21...  NA                NA            $110,000.00 - $170,000.00 (Yearly Salary)  

(...) было сделано для аккуратного представления кадра данных.

Однако, как видите, две строки не обязательно имеют одинаковые атрибуты. Например, первая строка имеет минимальный опыт и обязательное путешествие, но во второй строке эти поля не существуют, но имеют зарплату. Так что это становится очень сложно для меня. Я думал, что буду читать между \n символами, но они не установлены, у некоторых есть две новых строки, у других есть 4 или 5. Мне было интересно, может ли кто-нибудь помочь мне. Я буду признателен!

1 Ответ

2 голосов
/ 30 апреля 2020

Мы можем разбить строку на один или несколько '\n' ('\n{1,}'). Удалите первое слово из каждого (которое 'Job Information'), поскольку оно нам нигде не нужно (x <- x[-1]). Для оставшейся части строки мы видим, что они попарно в виде columnname - columnvalue. Из этого мы создаем фрейм данных, используя чередующийся индекс, и bind_rows объединяем их все по имени.

dplyr::bind_rows(sapply(strsplit(gsub(':', '', x), '\n{1,}'), function(x) {
   x <- x[-1]
   setNames(as.data.frame(t(x[c(FALSE, TRUE)])), x[c(TRUE, FALSE)])
}))

#                                        Location   Job ID         Posted  Min Experience 
#1 Scarsdale, New York, 10583-3050, United States  53827738 April 22, 2020       3-5 Years
#2       Glenview, Illinois, 60025, United States  53812433 April 21, 2020            <NA>
#   Required Travel                                    Salary 
#1            0-10%                                      <NA>
#2             <NA> $110,000.00 - $170,000.00 (Yearly Salary)
...