我有一个像这样结构的txt文件(这是文件的摘录):
# A network in a general multiplex format
*Vertices 280
1 "S1MRS0008.MID02.02.P2.nov13"
2 "S1MRS0038.MID11.11.P2.nov13"
3 "S1MRS0060.MID18.18.P2.nov13"
4 "S1MRS0070.MID19.19.P2.nov13"
*Multiplex
# layer node layer node [weight]
# Intralayer edges
1 49 1 80 0.0930232558139535
1 40 1 39 0.0652173913043478
1 40 1 72 0.0652173913043478
1 40 1 67 0.0652173913043478
# Interlayer edges
1 30 2 122 0.0652173913043478
1 61 2 148 0.0681818181818182
1 37 2 164 0.108695652173913
1 5 2 164 0.06
使用R,我想阅读Intralayer
和Interlayer
部分并创建每个部分的数据框(包含5列)。我宁愿这样做而不用手动分解文件,因为我有很多。有什么想法吗?
答案 0 :(得分:0)
从文件(参见注释掉的行)或字符串中将数据读入L
。
接下来形成一个分组变量g
,它区分了各个部分。将其拆分为部分列表s
,然后删除每个部分的第一行,即Content
。如果has_len[i]
的第i部分中存在非零行数,则Content
为TRUE。现在阅读Content
具有行的那些组件中的行,并从s
的每个组件的第一行设置名称。没有包使用。
# L <- trimws(readLines("myfile"))
L <- trimws(readLines(textConnection(Lines)))
g <- cumsum(grepl("^[#*]", L))
s <- split(L, g)
Content <- lapply(s, tail, -1)
has_len <- lengths(Content) > 0
Content <- lapply(Content[has_len], function(x) read.table(text = x))
names(Content) <- sub("^[#*] ", "", sapply(s, head, 1))[has_len]
,并提供:
> Content
$`*Vertices 280`
V1 V2
1 1 S1MRS0008.MID02.02.P2.nov13
2 2 S1MRS0038.MID11.11.P2.nov13
3 3 S1MRS0060.MID18.18.P2.nov13
4 4 S1MRS0070.MID19.19.P2.nov13
$`Intralayer edges`
V1 V2 V3 V4 V5
1 1 49 1 80 0.09302326
2 1 40 1 39 0.06521739
3 1 40 1 72 0.06521739
4 1 40 1 67 0.06521739
$`Interlayer edges`
V1 V2 V3 V4 V5
1 1 30 2 122 0.06521739
2 1 61 2 148 0.06818182
3 1 37 2 164 0.10869565
4 1 5 2 164 0.06000000
上面我们将它用于Lines:
Lines <- '# A network in a general multiplex format
*Vertices 280
1 "S1MRS0008.MID02.02.P2.nov13"
2 "S1MRS0038.MID11.11.P2.nov13"
3 "S1MRS0060.MID18.18.P2.nov13"
4 "S1MRS0070.MID19.19.P2.nov13"
*Multiplex
# layer node layer node [weight]
# Intralayer edges
1 49 1 80 0.0930232558139535
1 40 1 39 0.0652173913043478
1 40 1 72 0.0652173913043478
1 40 1 67 0.0652173913043478
# Interlayer edges
1 30 2 122 0.0652173913043478
1 61 2 148 0.0681818181818182
1 37 2 164 0.108695652173913
1 5 2 164 0.06'