我正在尝试将R用于研究,但发现读取文件的一部分并进行一些计算并对计算完成的次数取平均值是具有挑战性的。例如。我有一个像这样的文件:
框架
1
atoms in the system
14657
Box Dimensions
5.870700
5.870700
5.870700
Methane molecules Trajectory
14601 1 4.043000 1.539000 3.324000
14602 1 3.979000 3.490000 1.266000
14603 1 0.276000 1.889000 1.967000
14604 1 3.710000 5.806000 1.362000
14605 1 1.467000 1.433000 2.991000
14606 1 2.675000 3.919000 1.486000
14607 1 5.483000 0.201000 0.685000
14608 1 5.371000 5.367000 3.819000
frame
2
atoms in the system
14657
Box Dimensions
5.870700
5.870700
5.870700
Methane molecules Trajectory
14601 1 4.043000 1.539000 3.324000
14602 1 3.979000 3.490000 1.266000
14603 1 0.276000 1.889000 1.967000
14604 1 3.710000 5.806000 1.362000
14605 1 1.467000 1.433000 2.991000
14606 1 2.675000 3.919000 1.486000
14607 1 5.483000 0.201000 0.685000
14608 1 5.371000 5.367000 3.819000
frame
3
atoms in the system
14657
Box Dimensions
5.870700
5.870700
5.870700
Methane molecules Trajectory
14601 1 4.043000 1.539000 3.324000
14602 1 3.979000 3.490000 1.266000
14603 1 0.276000 1.889000 1.967000
14604 1 3.710000 5.806000 1.362000
14605 1 1.467000 1.433000 2.991000
14606 1 2.675000 3.919000 1.486000
14607 1 5.483000 0.201000 0.685000
14608 1 5.371000 5.367000 3.819000
我需要跳过每帧的前9行,并用3-5列进行计算。我必须为每个框架重复计算并找到平均值。请您指导我。谢谢。
答案 0 :(得分:0)
如果我正确理解,以下代码将从文件中读取示例数据集中的表。
首先,以交互方式(或通过所需的任何方法)选择文件。
fl <- file.choose()
现在,阅读完整的表,每个表有5列。
lns <- readLines(fl)
frm <- grep("frame", lns, ignore.case = TRUE)
frm <- c(frm[-1], length(lns))
mth <- grep("methane", lns, ignore.case = TRUE)
df_list <- lapply(seq_along(frm), function(i) {
con <- textConnection(lns[ (mth[i] + 1):(frm[i] - 1) ])
dat <- read.table(con)
close.connection(con)
dat
})
最后,如果只需要第3、4和5列,将提取它们并生成一个名为df_list3
的列表。
df_list3 <- lapply(df_list, '[', 3:5)