我有一个CSV格式的文件列表,例如:
20150507.csv
a,10
b,20
c,30
20150506.csv
a,100
b,20
c,1
等等。我有一个包含变量名称的文本文件:
LIST.TXT
a
b
c
d
我需要以list.txt
文件中包含变量值的方式导入数据:
a: 10, 100,...
b: 20, 20, ...
c: 30, 1, ...
从与日期名称模式匹配的所有CSV文件中搜索元素的值(来自list.txt
),并且在收集所有值之后,我需要计算每个变量的均值和标准差,并标记观察值与异常值相比,平均值超过2 SD。
目前我正在使用bash
命令为list.txt
的每个元素创建统计信息,然后在R中加载数据。
for i in `cat list.txt |cut -d, -f1`; do echo "$i";grep "^$i" 2015* | cut -d: -f2 > /tmp/$i.stat;done
然后在R中使用for
循环来查找异常值:
files=list.files(path="/tmp/",pattern=".stat")
for( i in 1:length( files)){
myfunction(paste("/tmp/",files[[i]],sep='')
}
myfunction(filename)
{df <- read.csv(filename, header=F);
names(df)=c("symbol","num");
x=df[abs(df$num-mean(df$num))>2*sd(df[,2]),];outl=(nrow(x)/nrow(df))*100;if(outl>1){cat(filename,"\n");
cat("outliers=",outl);cat("\n\n")
但是,我只想在R中完成整个过程,而不是通过bash
创建多个文件,然后使用for
循环读取它们。
我读了this grep manual for R,但是没有显示搜索多个文件选项。
我没有使用for
,而是使用了:
df <- do.call(rbind, lapply(list.files(path="/tmp/",pattern = "*.stat"), read.csv,header=FALSE))
这看起来更好。
然而df2 <- do.call(rbind, lapply(list.files(path="/orignal/dir/",pattern = "2015*.abc.csv"), read.csv,header=FALSE))
并不能让R了解我正在搜索名称以2015 *开头并以abc.csv结尾的所有文件