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