我写了一些R代码来对我的研究项目进行分析。我编写它的方式是有一个输出文本文件,其中包含程序的状态。现在输出文件的标题如下所示:
start time: 2014-10-23 19:15:04
starting analysis on state model: 16
current correlation state: 1
>>>em_prod_combs
em_prod_combs
H3K18Ac_H3K4me1 1.040493e-50
H3K18Ac_H3K4me2 3.208806e-77
H3K18Ac_H3K4me3 0.0001307375
H3K18Ac_H3K9Ac 0.001904384
'>>> em_prod_combs“在第4行第5行再次重复(R代码)。我想要数据来自6。这个数据继续36行,所以在第42行结束然后文件中还有一些其他文本,直到像742一样,看起来像这样:
(742) >>>em_prod_combs
(743) em_actual_perc
(744) H3K18Ac_H3K4me1 0
H3K18Ac_H3K4me2 0
H3K18Ac_H3K4me3 0.0001976819
H3K18Ac_H3K9Ac 0.001690382
我再次想要从第744行(实际数据,而不是标题)中选择数据,再去另外36行并在第780行结束。这是我的部分代码:
filepath <- paste(folder_directory, corr_folders[fi], filename, sep="" )
con <- file(filepath)
open(con);
results.list <- list();
current.line <- 0
while (length(line <- readLines(con, n = 1, warn = FALSE)) > 0) {
if(line==">>>em_prod_combs"){
storethenext <- TRUE
}
}
close(con)
在这里,我试图查看读取的行是否具有“&gt;&gt;&gt;”标记。如果是这样,请将变量设置为TRUE并将后36行(使用另一个计数器变量)存储在数据框或列表中,并将storethenext
变量设置回F
。我有点希望有更好的方法来做到这一点......
答案 0 :(得分:1)
所以我意识到ReadLines有一个参数可以设置为跳过线。基于此,我得到了这个:
df <- data.frame(name = character,
params = numeric(40),
stringsAsFactors = FALSE)
con <- file(filepath)
open(con);
results.list <- list();
current.line <- 0
firstblock <- readLines(con, n = 5, warn = FALSE)
firstblock <- NULL #throwaway
firstblock <- readLines(con, n = 36, warn = FALSE)
firstblock <- as.list(firstblock) #convert to list
for(k in 1:36){
splitstring = strsplit(firstblock[[k]], " ", fixed=TRUE)
## put the data in the df
}
但是从Ben的回答可以看出,read.table可以在同一行中做同样的事情:所以我把它减少到下面的一个班轮:
firstblock2 <- read.table(filepath, header = FALSE, sep = " ", skip = 5, nrows = 36)
这也使得它成为一个数据框架,并为我做了所有肮脏的工作。 read.table的文档在这里: https://stat.ethz.ch/R-manual/R-devel/library/utils/html/read.table.html
答案 1 :(得分:0)
在tidyverse
(readr
)中
如果您不希望将数据转换为数据框,则可以使用read_lines()
读取文本切片
(一定要注意n_max =
参数是要求读入多少行;而不是要停止的行数.tbh:最后我也发现这更好,因为通常我需要管理文件长度超过我需要隔离读入的代码段。)
firstblock <- read_lines(filepath, skip = 5, n_max = 31)
如果您不想考虑文件大小,可以修改代码:
start_line = 5
end_line = 36
line_count = end_line - start_line
firstblock <- read_lines(filepath, skip = start_line, n_max = line_count)
在任何情况下,我发现在发现这篇文章之后我更了解它们后,我发现有助于使用这些文件格式的其他内容:
如果您想立即将文件转换为列表,请使用:
read_lines_raw(filepath, skip = 5, n_max = 31)
你将获得一个31元素列表作为你的firstblock元素,而不是你用第一个元素获得的字符元素。
我在那里偶然发现了其他超酷的功能(并被移动分享 - 因为我认为他们摇滚):
.gz
,.bz2
,.xz
或.zip
个文件。http://
,https://
,ftp://
或ftps://
开头,如果事情需要回到原点,那么使用基本版本write_lines
功能会更加愉快。具体来说,没有FileConn可以打开和关闭:只需指定对象和您希望将其写入的文件名。
所以例如下面的内容:
fileConn <- file("directory/new.sql")
writeLines(new_sql, fileConn)
close(fileConn)
只是:
write_lines(new_sql, "directory/new.sql")
享受,希望这会有所帮助!