首页 > 解决方案 > 如何从头到尾操作长的单字符串文本文件并将变量存储在 R 的列表中?

问题描述

我有一个文本文件,其中包含大约 1,000 组,NAME如下N所示(为简单起见,我只选择了两组)。

    NAME="2 B11101001",
     N=5049, 20016, 5163, 20081, 5161, 20431, 5023, 5219, 5221,
       5225, 5223, 5227, 5003, 5105, 20623, 5107, 5109, 5111, 5113, 5121, 5007
    NAME="1 A2110111 >",
     N=12034, 2195, 2197, 2199, 2201, 2109, 2032, 20295, 2203, 2205,
       2207, 2107, 2177, 20546, 11528, 20196, 2105, 21031, 11526,
       11011, 11013, 11512, 11225, 11227, 11229, 13169, 13171,
       13173, 11231, 21128, 11233, 10502, 10500, 10498, 10496,
       10494, 11912, 11778, 10492, 11946, 10490, 10488, 11802,
       10486, 11834, 10484, 11844, 10482, 10478, 11694, 11037,
       12087, 12965, 12957, 12953, 12089, 12091, 12481, 12549,
       12941, 12483, 12101, 12103, 12933, 11800, 12927, 11810,
       12923, 12105, 12111, 12113, 12731, 12739, 20806, 12745,
       12117, 12119, 12503, 10264, 11079, 10262, 12505, 12499,
       14431, 14423, 11649, 11677, 14421, 11081, 14461

我需要加载此文本文件并将其转换为list如下所示的格式:

$ NAME
[1] 2 B11101001
[2] 1 A2110111 >
$ N
[1] 5049 20016 5163 20081 ... 
[2] 12034 2195 2197 ...

NAME是一组的标识符NN表示节点的顺序。

我有另一组NAME和其他格式的属性data.frame如下所示:

NAME          FARE     FREQUENCY
2 B11101001   1000     10
1 A2110111 >  2000     5  

这些将与加载的文本文件合并,如下所示:

$ NAME
[1] 2 B11101001
[2] 1 A2110111 >
$ N
[1] 5049 20016 5163 20081 ... 
[2] 12034 2195 2197 ...
$FARE
[1] 1000
[2] 2000
$FREQUENCY
[1] 10
[2] 5

我想我可以合并这两个数据集,但是我不知道如何加载不遵循序号逗号分隔格式的文本文件。

目前我使用函数加载了文本文件,readChar但找不到将其转换为列表的方法。

在此处输入图像描述

如前所述,NAME是一个标识符,用于确定一组N. N是由逗号分隔的一组简单数字(但应保持其顺序)。当我们找到 next 时,下一对开始NAME。有什么方法可以实现吗?

非常感谢您的建议。

标签: rstringtext

解决方案


一种方法是使用该ReadLines()函数将文本输入 R。
然后识别以“NAME=”和“N=”开头的行,将行分成不同的组,从每行中删除不需要的部分并组合成适当的向量。
有关更多信息,请参阅脚本中的注释。

#read text into R
text <-readLines("Stackquestion.txt")

#find rows with Name and clean up
namerows <- grep("NAME=", text)
namelist <- gsub('",', "", trimws(gsub('NAME="', "", text[namerows])))


#find rows with N
Nrows <- grep("N=", text)

ranges <- c((namerows[-1]-1), length(text))

#Remove the line breaks on the N= rows and combine
Nlist <-sapply(1:length(Nrows), function(i){
   cleantext<-trimws(text[Nrows[i]:ranges[i]])
   cleantext <- gsub('N=', "", cleantext)
   cleaned<-paste(cleantext, collapse = "")
   cleaned
})


> namelist
[1] "2 B11101001"  "1 A2110111 >"
> Nlist
[1] "5049, 20016, 5163, 20081, 5161, 20431, 5023, 5219, 5221,5225, 5223, 5227, 5003, 5105, 20623, 5107, 5109, 5111, 5113, 5121, 5007"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
[2] "12034, 2195, 2197, 2199, 2201, 2109, 2032, 20295, 2203, 2205,2207, 2107, 2177, 20546, 11528, 20196, 2105, 21031, 11526,11011, 11013, 11512, 11225, 11227, 11229, 13169, 13171,13173, 11231, 21128, 11233, 10502, 10500, 10498, 10496,10494, 11912, 11778, 10492, 11946, 10490, 10488, 11802,10486, 11834, 10484, 11844, 10482, 10478, 11694, 11037,12087, 12965, 12957, 12953, 12089, 12091, 12481, 12549,12941, 12483, 12101, 12103, 12933, 11800, 12927, 11810,12923, 12105, 12111, 12113, 12731, 12739, 20806, 12745,12117, 12119, 12503, 10264, 11079, 10262, 12505, 12499,14431, 14423, 11649, 11677, 14421, 11081, 14461"

推荐阅读