R - Импорт текстового файла, который содержит информацию в строках заголовка над основной таблицей данных - PullRequest
2 голосов
/ 08 января 2020

Я хочу импортировать текстовый файл, который содержит таблицу результатов с двумя строками заголовка над ним. Содержимое строк заголовка должно быть включено как дополнительные столбцы в результирующий data.frame.

В следующем текстовом файле примера строки Region и Month являются строками заголовка, а оставшаяся часть файла - таблица результатов.

Region  South Africa
Month   July
Sepal.Length    Sepal.Width Petal.Length    Petal.Width Species
1   5.1 3.5 1.4 0.2 setosa
2   4.9 3   1.4 0.2 setosa
3   4.7 3.2 1.3 0.2 setosa

должен стать data.frame, который включает столбцы для Region и Month:

wanted.df<-structure(list(Sepal.Length = c(1, 2, 3), Sepal.Width = c(5.1, 
4.9, 4.7), Petal.Length = c(3.5, 3, 3.2), Petal.Width = c(1.4, 
1.4, 1.3), Species = c(0.2, 0.2, 0.2), Region = c("South Africa", 
"South Africa", "South Africa"), Month = c("July", "July", "July"
)), row.names = c(NA, -3L), class = c("spec_tbl_df", "tbl_df", 
"tbl", "data.frame"))

Мне удалось сделать это, создав два data.frames, один из которых содержит информация заголовка, вторая содержит таблицу результатов, а затем объединяет их, но это кажется мне немного неуклюжим:

#Create data frame from first two lines of text (the header)
header <- scan('example.txt', nlines = 2, what = character(),sep = "\n")
header.df<-data.frame((sapply(header,function(x){str_split(x, "\t")})),stringsAsFactors=FALSE)
colnames(header.df) <- as.character(header.df[1,])
header.df<-header.df[-1,]

#Create data frame from first remainder of the file which contains the results table  
results.df<-read_tsv('example.txt',col_names = T,skip=2)

#helper column added to both data frames for merging
results.df$helper.col<- "match"
header.df$helper.col<-"match"
df.example<-inner_join(results.df,header.df, by = "helper.col", copy = FALSE)
wanted.df<-select(df.example,-helper.col)

Есть ли более элегантный способ?

Ответы [ 2 ]

3 голосов
/ 08 января 2020

Предполагая, что комментарий @H 1 правильный, это разделенный табуляцией файл. Мы можем сделать

df1 <- read.table('example.txt', nrows = 2, sep = "\t")
df2 <- data.frame(matrix(df1$V2, ncol = nrow(df1), dimnames = list(NULL, df1$V1)))
df3 <- read.table(text = 'example.txt', skip = 2, header = TRUE)
cbind(df3, df2)

#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species       Region Month
#1          5.1         3.5          1.4         0.2  setosa South Africa  July
#2          4.9         3.0          1.4         0.2  setosa South Africa  July
#3          4.7         3.2          1.3         0.2  setosa South Africa  July
2 голосов
/ 08 января 2020

Я бы сделал это так:

header <- readLines('file.txt', n = 2)
header <- stringi::stri_split_regex(header, '\\W+', n = 2)

dat <- read.table('file.txt', skip = 2, stringsAsFactors = FALSE)
for(i in header){ dat[ i[1] ] <- i[2] }

# > dat
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species       Region Month
# 1          5.1         3.5          1.4         0.2  setosa South Africa  July
# 2          4.9         3.0          1.4         0.2  setosa South Africa  July
# 3          4.7         3.2          1.3         0.2  setosa South Africa  July
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...