Criar um dataframe pela combinação de duas linhas de informação em *txt

Prezados membros do r-br, Eu gostaria de criar um novo data frame à partir de output de uma análise em *txt empregando o pacote *tidyverse*, sendo: library(tidyverse) #Arquivo original https://www.dropbox.com/s/2f13c2wb66zfrmr/result.txt?dl=0 #Faço a leitura do arquivo myfile<-read_lines("result.txt") #Separo o nome do arquivo filename<-myfile[1] filename<-gsub("\\..*","",filename) filename #[1] "sample_107" #Então removo a primeira linha que só tem a informação do nome do arquivo que o originou myfile<-myfile[-1] #Estrutura parcial do arquivo myfile # head(myfile) #[1] "lca: 84%" #[2] "left=475, right=586, top=0, bottom=527, obj_id=0, obj=lca " #[3] "lca: 82%" #[4] "left=548, right=553, top=0, bottom=722, obj_id=0, obj=lca " #[5] "lca: 79%" $[6] "left=439, right=534, top=174, bottom=440, obj_id=0, obj=lca " # Agora, eu quero criar um data frame onde eu reorganize essa informação de modo que sempre a linha superior que começa com "lca:... forme a última coluna da informação da linha abaixo que inicia-se com "left= ...., de forma que meu *dataframe* final fique, baseado na estrutura parcial apresentada: left right top bottom obj_id obj lca 475 586 0 527 0 lca 84 548 553 0 722 0 lca 82 439 534 174 440 0 lca 79 Para ao final salvar como: write.table(mydataframe, paste0("pred_",filename, "*txt"),h=T) Tentei uma derivação das sugestões do Max, mas eu tenho um problema, pois na primeira linha os valores estão depois de ":" e na segunda depois de "=". Também tenho uma variável que chama lca na primeira linha e um nível lca na variável obj do meu arquivo myfile. names_col <- c("left", "right", "top", "botton", "obj_id", "obj","lca") mydf <- myfile %>% str_subset("lca$") %>% enframe(name = NULL) %>% separate(col = value, into = names_col, sep = "[=,]") %>% mutate_all(parse_number) head(as.data.frame(mydf)) #[1] left right top botton obj_id obj lca #<0 linhas> (ou row.names de comprimento 0) Alguém que trabalha com manipulação de tabelas em R teria alguma dica para dar? Obrigado, Alexandre

Segue outra sugestão usando pacote base do R: mydf <- cbind.data.frame(do.call(rbind, lapply(strsplit(myfile[!seq(length(myfile)) %% 2], ", "), function(x)gsub(".*\\=", "", x))), lca = gsub(".*\\:\\s+", "", myfile[seq(length(myfile)) %% 2])) On Mon, Mar 30, 2020 at 12:03 PM ASANTOS por (R-br) < r-br@listas.c3sl.ufpr.br> wrote:
Prezados membros do r-br,
Eu gostaria de criar um novo data frame à partir de output de uma análise em *txt empregando o pacote *tidyverse*, sendo:
library(tidyverse)
#Arquivo original https://www.dropbox.com/s/2f13c2wb66zfrmr/result.txt?dl=0
#Faço a leitura do arquivo myfile<-read_lines("result.txt")
#Separo o nome do arquivo filename<-myfile[1] filename<-gsub("\\..*","",filename) filename #[1] "sample_107"
#Então removo a primeira linha que só tem a informação do nome do arquivo que o originou myfile<-myfile[-1]
#Estrutura parcial do arquivo myfile # head(myfile) #[1] "lca: 84%" #[2] "left=475, right=586, top=0, bottom=527, obj_id=0, obj=lca " #[3] "lca: 82%" #[4] "left=548, right=553, top=0, bottom=722, obj_id=0, obj=lca " #[5] "lca: 79%" $[6] "left=439, right=534, top=174, bottom=440, obj_id=0, obj=lca " #
Agora, eu quero criar um data frame onde eu reorganize essa informação de modo que sempre a linha superior que começa com "lca:... forme a última coluna da informação da linha abaixo que inicia-se com "left= ...., de forma que meu *dataframe* final fique, baseado na estrutura parcial apresentada:
left right top bottom obj_id obj lca 475 586 0 527 0 lca 84 548 553 0 722 0 lca 82 439 534 174 440 0 lca 79
Para ao final salvar como: write.table(mydataframe, paste0("pred_",filename, "*txt"),h=T)
Tentei uma derivação das sugestões do Max, mas eu tenho um problema, pois na primeira linha os valores estão depois de ":" e na segunda depois de "=". Também tenho uma variável que chama lca na primeira linha e um nível lca na variável obj do meu arquivo myfile.
names_col <- c("left", "right", "top", "botton", "obj_id", "obj","lca")
mydf <- myfile %>% str_subset("lca$") %>% enframe(name = NULL) %>% separate(col = value, into = names_col, sep = "[=,]") %>% mutate_all(parse_number)
head(as.data.frame(mydf)) #[1] left right top botton obj_id obj lca #<0 linhas> (ou row.names de comprimento 0)
Alguém que trabalha com manipulação de tabelas em R teria alguma dica para dar?
Obrigado,
Alexandre
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- Henrique Dallazuanna Curitiba-Paraná-Brasil 25° 25' 40" S 49° 16' 22" O
participantes (2)
-
ASANTOS
-
Henrique Dallazuanna