我在名为mydata
我可以这样列出:
dir1<- list.files ("C:\\mydata", "*.txt", full.names = TRUE)
文件的第一部分名为bg16.txt
bg3.txt …..
bg(数字).txt`。
文件的第二部分名为yt16.txt yt3.txt …..
yt(number).txt`。
其余文件名为zj16.txt
zj3.txt
...... zj(number).txt
。
随机数,但最大值为20
,min为1
。
我可以阅读编号为6
的文件并应用回归:
b=read.table("C:\\mydata\\bg6.txt",sep=""):
> head(b)
x
1 0.29
2 0.21
z=read.table("C:\\mydata\\zj6.txt",sep=""):
> head(z)
x
1 0.10
2 0.56
y=read.table("C:\\mydata\\yt6.txt",sep=""):
> head(y)
x
1 0.56
2 0.32
names(b)="b";names(y)="y";names(z)="z"
dt=cbind(b,y,z)
res6=lm(y~ b + z, data=dt)
现在我可以手动逐个为所有文件执行此操作,但这将花费大量时间。我想知道是否有任何函数可以匹配数字中对应的文件:greb这三个文件使用相同的数字bg(number).txt, zj(number).txt, yt(number).txt
将yt(number).txt
称为y
,将zj(number).txt
称为z
,将bg(number).txt
称为b
,然后查找6
的回归}
答案 0 :(得分:4)
您可以拆分文件名以提取字母部分和数字部分。然后,您可以遍历唯一的数字,以获取每个分析的文件集。像这样的东西
# test data
dir1<-c("zj6.txt","yt6.txt","bg6.txt")
# Using this helper function... https://gist.github.com/MrFlick/10413321
nn<-do.call(rbind, regcapturedmatches(dir1,regexpr("(\\w+)(\\d+)\\.txt", dir1, perl=T)))
lapply(unique(nn[,2]), function(n) {
b <- read.table(dir1[nn[,1]=="bg" & nn[,2]==n],sep="", col.names="b");
z <- read.table(dir1[nn[,1]=="zj" & nn[,2]==n],sep="", col.names="z");
y <- read.table(dir1[nn[,1]=="yt" & nn[,2]==n],sep="", col.names="y");
lm(y~ b + z, data=cbind(b,z,y))
})
答案 1 :(得分:1)
您只需要使用正确的模式。例如,您的文件似乎没有编号为...001 , ...002
,因此这应该可以抓取所有以6结尾的文件。
list.files('C:\\mydata', pattern = '[^[:digit:]]6.txt', full.names = T)
在您的情况下,您只想要三种不同的案例,以便您可以写
list.files('C:\\mydata', pattern = '((bg)|(zj)|(yt))6.txt', full.names = T)
现在你可以迭代它,在每一步创建所需的模式,例如:
sprintf('((bg)|(zj)|(yt))%i.txt', k)