我有一个包含21个字符串的列表,名为“r1score.list”。我通过从文件夹中读取文本文件来制作此列表。然后我将每个txt放入一个数据框,并将它们放在另一个名为“r1.score”的列表中。 (你可以忽略函数(x){sortertoDF(x)},因为我正在调用一个我在其他地方编写的函数来操作数据。)
r1score.list <- dir(pattern="*.txt")
> r1score.list
[1] "p01_control.txt" "p02_control.txt" "p03_control.txt" "p04_pq.txt" "p05_pq.txt" "p06_pq.txt"
[7] "p07_doce.txt" "p08_doce.txt" "p09_doce.txt" "p10_dact.txt" "p11_dact.txt" "p12_dact.txt"
[13] "p16_carm.txt" "p17_carm.txt" "p18_carm.txt" "p19_cisplatin.txt" "p20_cisplatin.txt" "p21_cisplatin.txt"
[19] "p22_amsacrine.txt" "p23_amsacrine.txt" "p24_amsacrine.txt"
r1.score <- llply(.data=r1score.list, .fun=function(x){sortertoDF(x)})
现在,我已经通过这样做命名了r1.score中的每个数据框:
names(r1.score) <- r1score.list
但我想用下划线后面的单词命名每个数据框。意思是,如果我在r1.score中调用第一个数据帧,我希望它具有名称“control”。如果我调用第四个数据帧,我希望它的名称为“pq”。如果我调用最后一个数据框,我希望它的名称为“amsacrine”等等。我不想通过21个txt文件并给它们新名称,以便我可以这样做。有更简单的方法吗?
谢谢。
答案 0 :(得分:3)
使用正则表达式(sub
的第一个参数的时髦模式)很容易做到这一点:
names(r1.score) <- sub(".*_(.*)\\..*", "\\1", r1score.list)
第二个参数是我们替换正则表达式匹配的值。在这种情况下,它是一个特殊符号\\1
,它是对括号内(.*)
匹配的模式部分的引用。如果你仔细观察,你可以看到在括号之前我们匹配.*_
,这意味着“任何以下划线结尾的东西”,另一方面我们匹配\\..*
,这意味着任何以句号开头的东西(我们需要使用\\.
,否则将一段时间视为外卡。