r - 如何从头到尾操作长的单字符串文本文件并将变量存储在 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
是一组的标识符N
。
N
表示节点的顺序。
我有另一组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
。有什么方法可以实现吗?
非常感谢您的建议。
解决方案
一种方法是使用该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"
推荐阅读
- css - Safari 上的 snap 滚动容器内的线性滚动
- rust - 我可以在结构体内部调用宏吗?
- flutter - Dart 中线程、隔离和进程的区别
- excel - 多平台 Windows 和 MAC 计算机识别
- netsuite - customer.copy : 请输入值: 客户 ID 异常被抛出
- java - 获取 NoClassDefFoundError:无法初始化类 org.codehaus.groovy.vmplugin.v7.Java7
- sql - 如何在 Data Studio BigQuery 社区连接器的 SQL 查询中包含日期范围
- if-statement - if 语句和 Pascal 中的最大值
- ubuntu - 错误:模块“平台”没有属性“linux_distribution”
- r - 如何在 for 循环中在 Shiny 中打印 ggplots 列表