首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的均值函数尽管改变了要计算的参数,但仍然给我相同的输出

R中的均值函数尽管改变了要计算的参数,但仍然给我相同的输出
EN

Stack Overflow用户
提问于 2017-10-24 10:02:10
回答 2查看 180关注 0票数 0
代码语言:javascript
复制
 pollutantmean <- function(directory, pollutant, ID = 1:332){
+   files_list <- list.files("specdata", full.names = TRUE)
+   dat <- data.frame()
+   for (i in 1:332){
+     dat <- rbind(dat, read.csv(files_list[i]))
+   }
+   dat_subset <- subset(dat, dat$ID == ID)
+   mean(dat_subset$nitrate, na.rm = TRUE)
+   mean(dat_subset$sulfate, na.rm = TRUE)
+ }

1 3.189369污染平均(硝酸盐,70:72) 1 3.189369污染平均(“规格数据”,“硫酸盐”,1:10) 1 3.189369

EN

回答 2

Stack Overflow用户

发布于 2017-10-24 10:27:28

我认为问题是因为dat不存在,所以我们可以尝试:

代码语言:javascript
复制
if(exist("dat")== FALSE){
dat <- read.csv(i)
}else{
dat <- rbind(dat, read.csv(files_list[i]))
}
票数 0
EN

Stack Overflow用户

发布于 2017-10-24 11:05:50

您所观察到的行为是由行引起的。

代码语言:javascript
复制
dat_subset <- subset(dat, dat$ID == ID)

subset将在第一个参数中查找第二个参数中的任何变量。因此,当您说dat$ID == ID时,它首先在dat中查找ID。因为dat有一个名为ID的元素,所以它等同于表示dat$ID == dat$ID。因此,您实际上没有得到数据的子集;您使用的是完整的数据集。

为了说明,让我们使用mtcars数据集。此数据集有32行。其中一个列名为am,它由值01组成,指示车辆是自动变速器还是手动变速器。

代码语言:javascript
复制
nrow(mtcars)
[1] 32

让我们在am上定义一个子集am的向量

代码语言:javascript
复制
am <- 0

当我们对am进行子集时,我们只想在mtcars中得到am == 0中的那些行。

代码语言:javascript
复制
nrow(subset(mtcars, mtcars$am %in% am))
[1] 32

不过,这似乎不管用。注意,如果使用下一行,则得到相同的结果。

代码语言:javascript
复制
nrow(subset(mtcars, am %in% am))
[1] 32

现在,让我们更改我们的子集向量的名称,看看会发生什么。

代码语言:javascript
复制
am_list <- 0
nrow(subset(mtcars, am %in% am_list))
[1] 19

在本例中,subset没有在mtcars中找到一个名为am_list的列,因此它在mtcars之外查找一个名为am_list的对象。这种行为是?subset中警告背后的原因之一

这是一个便于交互使用的功能。对于编程来说,最好使用[这样的标准子集设置函数,特别是参数子集的非标准计算可能会产生意想不到的后果。

我认为你最好用这种方式写你的函数(我冒昧地重写了它)。

代码语言:javascript
复制
pollutantmean <- function(directory, pollutant, ID = 1:332){
  # Get file names from directory argument
  files_list <- list.files(directory, full.names = TRUE)

  # Create a single data frame from all of the files
  dat <- lapply(files_list,
                read.csv)
  dat <- do.call("rbind", dat)

  # Subset the data appropriately
  dat_subset <- dat[dat$ID %in% ID, ]

  # Get the mean of the two columns, return in a list
  lapply(dat_subset[c("nitrate", "sulfate")],
         mean,
         na.rm = TRUE)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46907607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档