在sapply

时间:2015-05-05 12:41:34

标签: r sapply

我在tmp目录中有一个.stat文件列表。

样品:

a.stat =>

abc,10

abc,20

abc,30

b.stat =>

xyz,10

xyz,30

xyz,70

等等

我需要查找所有.stat文件的摘要。 目前我正在使用 filelist<-list.files(path="/tmp/",pattern=".stat")

data<-sapply(paste("/tmp/",filelist,sep=''), read.csv, header=FALSE)

但是我需要对所有正在阅读的文件应用摘要。或者只是在n个.stat文件中我需要第二列的摘要

使用

data<-sapply(paste("/tmp/",filelist,sep=''), summary, read.csv, header=FALSE)不起作用,并给出了关于类字符的摘要,这不是我想要的。

sapply(filelist, function(filename){df <- read.csv(filename, header=F);print(summary(df[,2]))})运行正常。然而,我的总体目标是找到两侧超过2个标准偏差的值(异常值)。所以我使用sd,但同时需要检查当前读取的文件中的所有值是否都在2SD范围内。

3 个答案:

答案 0 :(得分:6)

一次应用多个功能:

f <- function(x){
  list(sum(x),mean(x))
}
sapply(x, f)

在您的情况下,您希望按顺序应用它们,因此首先阅读csv数据然后执行摘要:

sapply(lapply(paste("/tmp/",filelist,sep=''), read.csv), summary)

要对数据集进行子集化以在特定列上运行摘要,您可以使用从summaryfunction(x) summary(x[[2]])的更改外部sapply函数。

答案 1 :(得分:1)

在@Jangorecki中,我将函数更改为包括向量而不是列表。只有这样,它对我有用。我不确定为什么我的功能可以正常工作,而其他却不能。

f <- function(x){
  c(min = min(x), avg = mean(x))
}
sapply(df, f)

我在https://www.r-bloggers.com/applying-multiple-functions-to-data-frame/找到了解决方案

答案 2 :(得分:1)

对于不想在环境中保存的简短功能,也可以在sapply调用中完成。对于@flxflks的示例:

val animal: Animal<Dog> by DefaultDelegate()