Проблемы чтения таблицы в 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