R:用#分隔的不同部分读取文件

时间:2018-01-25 15:58:13

标签: r import

我有一个像这样结构的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,我想阅读IntralayerInterlayer部分并创建每个部分的数据框(包含5列)。我宁愿这样做而不用手动分解文件,因为我有很多。有什么想法吗?

1 个答案:

答案 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'