【问题标题】:apply multiple functions in sapply在 sapply 中应用多个函数
【发布时间】:2015-05-05 12:41:33
【问题描述】:

我在 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范围内。

【问题讨论】:

  • sapply(filelist, function(filename){df <- read.csv(filename, header=F);print(summary(df[,2]))}) ?
  • 如果您需要第二列的摘要,summary(sapply(lst, "[[", 2))

标签: r sapply


【解决方案1】:

一次应用多个功能:

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

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

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

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

【讨论】:

  • 这主要对我有用,但为什么我得到了额外的一行?以下示例中的 11 和 81 [[1]] abc 11 [[2]] Min.第一曲。中位数平均第三曲。最大限度。 2267000 2267000 3253000 2805000 3253000 3253000 [[3]] xyz 81 [[4]]第一曲。中位数平均第三曲。最大限度。 348000 645900 665200 649800 665200 963200
  • @user1977867 因为这不是按顺序应用函数,所以它应用第一个函数生成第一行,应用第二个函数生成第二行。
【解决方案2】:

添加到@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/找到了解决方案

【讨论】:

    【解决方案3】:

    对于您不想在环境中保存的短函数,也可以在 sapply 调用中完成。对于@flxflks 的例子:

    sapply(df, function(x) c(min = min(x), avg = mean(x)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 2016-02-02
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多