这是文件的一部分,
GIAO CHEMICAL SHIELDING TENSOR (PPM):
ISOTROPIC
X Y Z SHIELDING
( ANISOTROPY )
1 C X 192.9847 -0.3288 0.5647
Y 0.8908 133.5254 1.9987
Z -1.5286 1.9986 131.2590
152.5897
EIGENVALS: 192.9663 130.1130 134.6898
( 60.5649 )
2 O X 293.7037 -11.3068 19.4099
Y -27.8836 337.6867 -38.0711
Z 47.8680 -38.0711 380.8636
337.4180
EIGENVALS: 283.3105 413.4345 315.5091
( 114.0247 )
3 H X 32.4132 -2.6310 -3.6171
Y -0.9732 26.6966 2.2004
Z -1.6244 2.2423 28.7795
29.2964
EIGENVALS: 34.4129 28.1896 25.2868
( 7.6748 )
4 H X 32.4132 4.4443 0.5044
Y 1.8931 30.1789 0.2675
Z 0.0452 0.2257 25.2970
29.2964
EIGENVALS: 34.4129 28.1895 25.2867
( 7.6748 )
5 H X 31.3212 -2.3074 3.9610
Y -1.0235 26.9345 -1.8682
Z 1.7569 -1.8682 29.0533
29.1030
EIGENVALS: 33.8408 27.6219 25.8462
( 7.1067 )
6 H X 32.4086 -3.5167 6.0369
Y -2.5502 27.9731 -8.1180
Z 4.3777 -8.1180 37.1798
32.5205
EIGENVALS: 29.5456 44.7719 23.2441
( 18.3770 )
..... DONE WITH NMR SHIELDINGS .....
我对这些线之间的数据感兴趣," GIAO CHEMICAL SHENSING TENSOR(PPM)"和" .....完成核磁共振屏蔽......"
我想变成一个数据框,
1C 152.5897 60.5649
2O 337.4180 114.0247
3H 29.2964 7.6748
4H 29.2964 7.6748
5H 29.1030 7.1067
6H 32.5205 18.3770
我有其他这种性质的文件,但我不知道从哪里开始。好的,我可以使用readLines()将文件导入R,但之后......?
这是指向文件https://drive.google.com/file/d/0B2RulP80ivJaR0NVV1ZLRlpxVDA/view?usp=sharing的链接,而不仅仅是我的抓取。有些缩短版本的解决方案不适用于缩短版本的问题。处理完整的文件。
答案 0 :(得分:3)
读入文件,提取以(可能是空的)空格序列开头的行和打开的parens后跟数字。然后在第二行粘贴每个这样的行的前3个字符和字符58-68并删除所有空格:
# extract portion of file between ix[1] and ix[2]
L <- readLines("myfile.dat")
ix <- grep("GIAO CHEMICAL SHIELDING TENSOR|DONE WITH NMR SHIELDING", L)
L0 <- L[seq(ix[1]+1, ix[2]-1)]
# extract fields
g <- grep("^[ (]*\\d", L0, value = TRUE)
res <- gsub(" ", "", paste(substr(g, 1, 3), substr(g, 58, 68)))
这给出了:
> res
[1] "1C" "152.589" "60.564" "2O" "337.418" "114.024" "3H"
[8] "29.296" "7.674" "4H" "29.296" "7.674" "5H" "29.103"
[15] "7.106" "6H" "32.520" "18.377"
上面给出了所要求的内容,但您可能还想将其重塑为矩阵,
m <- matrix(res, ncol = 3, byrow = TRUE)
或data.frame,
data.frame(V1 = m[, 1], V2 = as.numeric(m[,2]), V3 = as.numeric(m[,3]))
答案 1 :(得分:1)
你也可以这样做:
library(stringr)
lines <- readLines("myfile.txt") #read the .txt file.
提取圆括号内的数字或数字后跟空格,后跟每行开头的字母。您可以使用正则表达式lookbehind
来提取括号内的内容,即。 (?<=\\() +[0-9.+]
- 声明(
在空格之后立即先于数字,点。
val1 <- na.omit(str_trim(str_extract(lines, perl("(?<=\\() +[0-9.]+|^\\d+ [A-Za-z]+"))))
创建一个逻辑索引,循环到val1
的长度并提取第1,第3,第5个元素....
indx <- c(TRUE, FALSE)
使用indx
的{{1}}或!
将indx
的元素提取为两列val1
和V1
。对于V3
,请查找V2
之前的行并提取数字。
EIGENVALS