【问题标题】:How to subset 2 parameters in 1 function如何对 1 个函数中的 2 个参数进行子集化
【发布时间】:2024-01-03 19:52:01
【问题描述】:

我有一个问题正在尝试解决,但遇到了一堵砖墙。我试图找到给定特定污染物名称和 ID 号的一组数据的平均值。所以我相信一直到 for 循环的代码都可以正常工作。我创建了一个带有 3 个参数的函数,创建了一个空的 data.frame,然后将我的所有文件绑定到一个名为“dat”的变量中。

现在我正在尝试通过“id”和特定的污染物名称(其中有两个名为硫酸盐和硝酸盐)来对这些新的绑定数据进行子集化。如您所见,for循环下的代码是一团糟。

具体来说,我不确定如何在一个“which”函数中对两个参数/参数进行子集化,因此我尝试为每个函数单独创建一个。我在想我可以使用中值函数来找到两者之间的平均值

pollutantmean <- function(directory, pollutant, id = 1:332) {
  files_list <- list.files(directory, full.names = TRUE)
   dat <- data.frame()
    for (i in 1:332){
     dat <- rbind(dat, read.csv(files.list[1]))
}

 subset_id <-dat[which(dat[, "id"] ==id) , ]
 subset_poll <-dat[which(dat[, "pollutant"] ==pollutant) , ]
 median(subset_id)
}

这是一张 R. 中头/尾数据的照片

EDIT1:所以我能够初始化函数(正确的术语?),但是当我尝试使用输入运行它时,我得到了许多“未定义的列选择”。

pollutantmean <- function(directory, pollutant, ID = 1:332) {
 files_list <- list.files(directory, full.names = TRUE)
   dat <- data.frame()
   for (i in 1:332) {
   dat <- rbind(dat, read.csv(files_list[1]))
  }
   subset_id <- dat[which(dat[, "ID"] == ID & dat[, "pollutant"] == 
      pollutant) ]
       median(subset_id[, "pollutant"], na.rm = TRUE)
  }

所以该函数可以很好地放入内存中,但是当我尝试输入参数“pollutantmean("specdata","sulfate", 1:10)" 时出现以下错误。

  Error in `[.data.frame`(dat, , "pollutant") : undefined columns selected
 In addition: Warning message:
 In dat[, "ID"] == ID :


 Error in `[.data.frame`(dat, , "pollutant") : undefined columns selected 

【问题讨论】:

  • which(dat[, "id"] == id &amp; dat[, "pollutant"] == pollutant).
  • 以后,请不要发布代码/数据/错误的图像:它不能被复制或搜索 (SEO),它会破坏屏幕阅读器,并且它可能不适合某些移动设备。参考:meta.*.com/a/285557/3358272。只需发布代码或数据文本,对其他人更友好(通常更快,ymmv)。
  • 顺便说一句:像这样重复 rbind 帧真的很糟糕:它适用于少数人,但如果/当你获得更多帧数时,你会发现每个都变得明显变慢:您应该知道每个rbind 操作完全复制每个操作的所有数据,它只是将新数据附加到旧数据的末尾。你现在对此很好,但是如果/当你处理更大的数据时,请记住它的扩展性很差。
  • @RuiBarradas 谢谢你的帮助。我能够让双重子集工作,但出现未定义的列选择错误...如果您不介意查看,我更新了我的主要帖子。
  • 不是"pollutant""sulfate" 还是"nitrate"

标签: r function subset data-science


【解决方案1】:

在一些外部帮助下,我能够解决这个问题。

pollutantmean <- function(directory, pollutant, ID = 1:332) {
 files_list <- list.files(directory, full.names = TRUE)
 dat <- data.frame()
  for (i in ID) {
   dat <- rbind(dat, read.csv(files_list[i]))
  }

      mean(dat[!is.na(dat[, "ID"]),pollutant], na.rm = TRUE)
 }

【讨论】:

    最近更新 更多