【发布时间】:2020-08-06 02:45:06
【问题描述】:
我对 R 比较陌生,我正在尝试编写我的第一个多步函数。本质上,我想创建一个函数,该函数接受一个目录并在该目录中搜索以找到某个列(在本例中为污染物)。然后找到该列的平均值并删除 NA。这是我目前所拥有的:
pollutantmean <- function(directory , pollutant , min_id = 1, max_id = 332) {
setwd(directory)
dirdata <- list.files(path=getwd() , pattern='*.csv' , full.names = TRUE) %>% lapply(read_csv) %>% bind_rows
specdata <- dirdata %>% filter(between(ID,min_id,max_id))
polspecdata <- specdata %>% select(pollutant)
polspecdatamean <- polspecdata %>% summarize(mean_pollutant=mean(pollutant,na.rm=TRUE))
}
我觉得我很接近,但结果是错误:警告消息:在mean.default(污染,na.rm = TRUE):参数不是数字或逻辑:返回NA。我相信错误是由于列类是 col_double。这可能是由于 dirdata 是从多个 csv 文件创建的。任何帮助将不胜感激。谢谢!
这是数据:zipfile_data
【问题讨论】:
-
嗨,M Doster,欢迎来到 SO。你能举个例子
pollutant的样子吗? -
这是目录中 csv 文件的示例: head(csv1) # A tibble: 6 x 4 Date 硫酸盐硝酸盐 ID
1 2003-01 -01 NA NA 1 2 2003-01-02 NA NA 1 3 2003-01-03 NA NA 1 4 2003-01-04 NA NA 1 5 2003-01-05 NA NA 1 6 2003-01-06 NA NA 1 -
尝试将
mean应用于数字或逻辑列,即mean(pollutant$sulfate,na.rm=TRUE)或$nitrate。 -
错误 "invalid for atomic vectors" 可能来自
$运算符,这意味着您正在尝试从不是 @987654329 的东西中获取帧列@(你说的是“性格”吗?)。老实说,M Doster,无论什么课程都使用pollutant,而且这个结构已经循环了很多次(每年),如果你在 SO 上搜索[r] pollutant,你会发现很多其他的都有可行的解决方案。不要复制,始终为课堂做自己的工作,但已知的工作示例可能非常有用。 -
@r2evans - 超过 400 万人在 Coursera 上参加了约翰霍普金斯大学的 R 编程 课程,因此在 SO 上有数千个关于
pollutantmean()的问题也就不足为奇了。也就是说,可能很少有人对dplyr非标准评估有问题,因为dplyr直到JHU 课程R Programming 之后的课程才引入。
标签: r function dataframe dplyr mean