Проблемы чтения таблицы в R

Я пытаюсь сделать read.table в R. Мои данные (TXT-файл) выглядит следующим образом:

a b c d e
Australia 1 2 4 3 2
United States 1 2 4 2 2

Проблемы с чтением этой таблицы:

1) Строка 1 имеет только 5 элементов (a~e), в отличие от 6 элементов во всех строках ниже этого. Предполагается, что имя столбца будет похоже на "Страна". Затем a соответствует первому числу 1, b соответствует 2,.. и e соответствует 2 (в случае Австралии.) Как добавить имя столбца в первый столбец, чтобы R не показывал ошибку что говорит "в строке 1 не было 6 элементов"?

2) В случае Соединенных Штатов, Соединенные Штаты - это два слова вместо одного, поэтому, когда R читает данные, он помещает "Штаты" во второй столбец вместо того, чтобы читать "Соединенные Штаты" как одно имя элемента.

(Мой друг посоветовал мне использовать имена строк. Кто-нибудь знает, как использовать имена строк??)

Как я могу исправить эти проблемы и правильно прочитать мои данные?

Большое спасибо!!

2 ответа

Вот еще одна возможность. Этот добавляет кавычки к любым двум словам, которые начинают строку

x <- readLines("your.txt")
x[1] <- paste("Country", x[1])
read.table(text=sub("([A-Za-z]{2,}\\s[A-Za-z]{2,})", "'\\1'", x), header=TRUE)
#         Country a b c d e
# 1     Australia 1 2 4 3 2
# 2 United States 1 2 4 2 2

Что касается комментария @ akrun о странах, содержащих более двух слов, я думаю, что это сработает:

x[4] <- 'Papua New Guinea 3 4 3 2 5'
xx <- sub("([A-Za-z]{2,}(\\s[A-Za-z]{2,})+)", "'\\1'", x)
read.table(text = xx, header = TRUE)
#            Country a b c d e
# 1        Australia 1 2 4 3 2
# 2    United States 1 2 4 2 2
# 3 Papua New Guinea 3 4 3 2 5

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

x <- readLines("your.txt")
read.table(text = sub("([A-Za-z]{2,}\\s[A-Za-z]{2,})", "'\\1'", x))
#               a b c d e
# Australia     1 2 4 3 2
# United States 1 2 4 2 2

Предполагая, что пример данных имитирует содержимое файла, мы можем прочитать его, используя readLines а затем использовать regex отделить country names от остальных. Разделенные названия стран могут быть добавлены в виде нового столбца.

lines <- readLines('Betty2.txt')
lines
#[1] "a b c d e"               "Australia 1 2 4 3 2"    
#[3] "United States 1 2 4 2 2"

dat <-  read.table(text=c(lines[1], gsub('[A-Za-z]+\\s+', '',
                lines[-1])), header=TRUE)

В приведенном выше коде мы заменяем character элементы, сопровождаемые пробелом. то есть. названия стран с '',

i.e 

 gsub('[A-Za-z]+\\s+', '',  lines[-1])
 #[1] "1 2 4 3 2" "1 2 4 2 2"

 dat1 <- data.frame(Country= gsub(" \\d+.*", '', lines[-1]),
                               dat, stringsAsFactors=FALSE)

Точно так же здесь мы заменяем space с последующим номером (\\d+) с последующим одним или несколькими символами .* с '',

 gsub(" \\d+.*", '', lines[-1])
 #[1] "Australia"     "United States"


dat1
#        Country a b c d e
#1     Australia 1 2 4 3 2
#2 United States 1 2 4 2 2
Другие вопросы по тегам