2015-09-30 3 views
0

У меня есть файл с кодами и их описаниями. Код всегда является короткой (3-6 символов) строкой букв, отделенной от следующего описания пробелом. Описание обычно несколько слов (также с пробелами). Вот пример:R: прочитайте первый столбец, а затем остальные

LIISS License Issued 
LIMOD License Modified 
LIPASS License Assigned (Partial Assignment) 
LIPND License Assigned (Partition/Disaggregation) 
LIPPND License Issued from a Partial/P&D Assignment 
LIPUR License Purged 
LIREIN License Reinstated 
LIREN License Renewed 

Я хотел бы, чтобы прочитать его в качестве кадра данных 2-колонки с кодом в первом столбце и описанием в второй. Как я могу это сделать с помощью R?

+2

сообщение воспроизводимый пример. –

ответ

2

Вы можете использовать stri_split_fixed() из стринги

library(stringi) 
as.data.frame(stri_split_fixed(readLines("x.txt"), " ", n = 2, simplify = TRUE)) 
#  V1           V2 
# 1 LIISS        License Issued 
# 2 LIMOD        License Modified 
# 3 LIPASS  License Assigned (Partial Assignment) 
# 4 LIPND License Assigned (Partition/Disaggregation) 
# 5 LIPPND License Issued from a Partial/P&D Assignment 
# 6 LIPUR        License Purged 
# 7 LIREIN       License Reinstated 
# 8 LIREN        License Renewed 

Здесь мы используем readLines() для чтения файла (показан "x.txt"). Затем stri_split_fixed() говорит, что мы хотим разбить на пробел и хотим, чтобы в столбце n = 2 (таким образом, только разбиение на первое пространство). simplify = TRUE используется для возврата матрицы вместо списка.

данных:x.txt

writeLines("LIISS License Issued 
LIMOD License Modified 
LIPASS License Assigned (Partial Assignment) 
LIPND License Assigned (Partition/Disaggregation) 
LIPPND License Issued from a Partial/P&D Assignment 
LIPUR License Purged 
LIREIN License Reinstated 
LIREN License Renewed", "x.txt") 
+0

Это сработало! Спасибо, Ричард! –

2

Мы могли бы прочитать это с помощью readLines, а затем создать два столбца data.frame с помощью sub

#read the lines with readLines 
lines <- readLines('pavel.txt') 
#match one or more spaces followed by one or more characters 
#replace with `''` to extract the non-space characters at the beginning. 
str1 <- sub('\\s+.*', '', lines) 
#match non space characters from the beginning (`^[^ ]+`) followed by space 
#replace with `''` to extract the characters that follow after the space. 
str2 <- sub('^[^ ]+\\s+', '', lines) 
out <- data.frame(v1= str1, v2=str2, stringsAsFactors=FALSE) 
head(out,3) 
#  v1         v2 
#1 LIISS      License Issued 
#2 LIMOD      License Modified 
#3 LIPASS License Assigned (Partial Assignment) 

Или другой вариант extract из library(tidyr) после прочтения набора данных в одном столбце. Мы используем группы захвата для извлечения символов, которые нам нужны в каждом столбце. Здесь ([^ ]+) соответствует одному или нескольким не-пробелам и фиксируется круглыми скобками, за которым следует одно или несколько пробелов (которые мы удаляем), а затем используйте вторую группу захвата для извлечения остальных символов.

library(tidyr) 
extract(read.table('pavel.txt', sep=','), V1, 
       into= c('V1', 'V2'), '([^ ]+)\\s+(.*)') 
#  V1           V2 
#1 LIISS        License Issued 
#2 LIMOD        License Modified 
#3 LIPASS  License Assigned (Partial Assignment) 
#4 LIPND License Assigned (Partition/Disaggregation) 
#5 LIPPND License Issued from a Partial/P&D Assignment 
#6 LIPUR        License Purged 
#7 LIREIN       License Reinstated 
#8 LIREN        License Renewed 

Или мы могли бы заменить первое пространство с , затем использовать read.csv с sep=','.

read.table(text=sub(' ', ',', readLines('pavel.txt')), sep=',') 
#  V1           V2 
#1 LIISS        License Issued 
#2 LIMOD        License Modified 
#3 LIPASS  License Assigned (Partial Assignment) 
#4 LIPND License Assigned (Partition/Disaggregation) 
#5 LIPPND License Issued from a Partial/P&D Assignment 
#6 LIPUR        License Purged 
#7 LIREIN       License Reinstated 
#8 LIREN        License Renewed 

Если мы используем Linux, то awk может быть передан с fread из data.table или read.csv/read.table.

library(data.table) 
fread("awk '{sub(\" \", \",\", $0)}1' pavel.txt", header=FALSE) 
#  V1           V2 
#1: LIISS        License Issued 
#2: LIMOD        License Modified 
#3: LIPASS  License Assigned (Partial Assignment) 
#4: LIPND License Assigned (Partition/Disaggregation) 
#5: LIPPND License Issued from a Partial/P&D Assignment 
#6: LIPUR        License Purged 
#7: LIREIN       License Reinstated 
#8: LIREN        License Renewed 
Смежные вопросы