Чтение текста в data.frame, где строковые значения содержат пробелы

Какой самый простой способ прочитать текст из печатного data.frame в data.frame, когда есть строковые значения, содержащие пробелы, которые мешают read.table? Например, этот отрывок из data.frame не представляет проблемы:

     candname party elecVotes
1 BarackObama     D       365
2  JohnMcCain     R       173

Я могу без проблем вставить его в вызов read.table:

dat <- read.table(text = "     candname party elecVotes
1 BarackObama     D       365
2  JohnMcCain     R       173", header = TRUE)

Но если в данных есть строки с такими пробелами:

      candname party elecVotes
1 Barack Obama     D       365
2  John McCain     R       173

Затем read.table выдает ошибку, интерпретируя «Барак» и «Обама» как две отдельные переменные.


person Sam Firke    schedule 28.05.2015    source источник
comment
Есть ли в ваших данных разделитель, отличный от пробела, возможно, табуляции? Ваши данные имеют фиксированную ширину? Ваши данные должны иметь некоторую структуру, чтобы R мог их правильно прочитать.   -  person MrFlick    schedule 28.05.2015
comment
Меня интересует обработка фрагментов данных, размещенных на SO, например: -in-column-in-r/" title="подмножество на основе повторяющихся значений в строке и условного в столбце в r"> stackoverflow.com/questions/30494359/ Или другие подобные, с номерами строк или без них . Возможно, я слишком узко спросил об этом с моим игрушечным примером.   -  person Sam Firke    schedule 28.05.2015
comment
Если вы отредактируете этот вопрос, вы увидите, что данные на самом деле содержат вкладки, но когда вопрос отображается в формате HTML, вкладки преобразуются в пробелы. Хорошие данные должны иметь надлежащий разделитель, и данные должны совместно использоваться в воспроизводимом формате . Попытка обойти плохое форматирование — дурацкая затея, потому что всегда найдутся способы сломать его.   -  person MrFlick    schedule 28.05.2015
comment
А, понятно, спасибо. Мой пример здесь был рассмотрен, и я принял ответ, но меня больше интересует использование таких данных. Как бы вы получили данные этого связанного вопроса в R - нажмите «Изменить», затем скопируйте и вставьте данные с разделителями табуляции в read.table? Возможно, мне следует опубликовать это как новый вопрос.   -  person Sam Firke    schedule 28.05.2015
comment
Что ж, я бы попросил ОП поделиться данными в более воспроизводимом формате . dput() data.frame гораздо проще импортировать в R. Кроме того, в нем будут все те же классы, которые создал пользователь. В противном случае вы можете отредактировать вопрос и попытаться скопировать данные. Помимо этого, вам нужно начать делать сильные (опасные) предположения о данных, чтобы импортировать их.   -  person MrFlick    schedule 28.05.2015


Ответы (1)


Прочитайте файл в L, удалите номера строк и используйте sub с указанным регулярным выражением, чтобы вставить запятые между оставшимися полями. (Обратите внимание, что "\\d" соответствует любой цифре, а "\\S" соответствует любому непробельному символу.) Теперь перечитайте его, используя read.csv:

Lines <- "      candname party elecVotes
1 Barack Obama     D       365
2  John McCain     R       173"

# L <- readLines("myfile")  # read file; for demonstration use next line instead
L <- readLines(textConnection(Lines))

L2 <- sub("^ *\\d+ *", "", L)  # remove row numbers
read.csv(text = sub("^ *(.*\\S) +(\\S+) +(\\S+)$", "\\1,\\2,\\3", L2), as.is = TRUE)

давая:

      candname party elecVotes
1 Barack Obama     D       365
2  John McCain     R       173

Вот визуализация регулярного выражения:

^ *(.*\S) +(\S+) +(\S+)$

Визуализация регулярных выражений

Демонстрация отладки

person G. Grothendieck    schedule 28.05.2015