我的目标是创建一个函数,从工作目录中读取指定的.csv文件(所有文件都具有相同的格式),将它们绑定到一个数据框中,然后返回指定列的平均值(&#34)该数据框的硝酸盐"或硫酸盐#34;)。目前的问题是每次我调用函数时,无论我选择读取多少文件/计算平均值的行数,该函数总是返回0.我不太认真确定如何解决这个问题,任何帮助表示赞赏。
pollutantmean <- function(pollutant, id = 1:332, directory =
"/Users/marsh/datasciencecoursera/specdata/") {
setwd(directory)
list <- list.files()
df <- data.frame()
for(i in id) {
x <- read.csv(list[i])
df <- rbind(df,x)
}
mean(!is.na(df["pollutant",]))
}
答案 0 :(得分:2)
如果您需要均值,并且数据使用中存在NA
:mean(df["pollutant",], na.rm = TRUE)
您正在计算出现NA
个的比率。如果你回来0,则意味着你只有NA
。所以也许还有其他错误。也许您可以在数据框架上使用dput()
,以便我们查看。
答案 1 :(得分:0)
语法错误。它应该是
mean(!is.na(df[[pollutant]]))
我们不需要pollutant
的引号,并且应该与输入参数相同。其次,,
意味着我们选择行名称作为索引的一般格式为row, column
,可以是numeric
或character
字符串。在这种情况下,我们需要计算特定列的缺失值的mean
。因此[[
将提取列或我们可以
mean(!is.na(df[,pollutant]))
整个功能现在应该是
pollutantmean <- function(pollutant, id = 1:332, directory =
"/Users/marsh/datasciencecoursera/specdata/") {
setwd(directory)
list <- list.files()
df <- data.frame()
for(i in id) {
x <- read.csv(list[i])
df <- rbind(df,x)
}
mean(!is.na(df[[pollutant]]))
}
这也可以使用data.table
library(data.table)
pollutantmean <- function(pollutant, id = 1:332, directory =
"/Users/marsh/datasciencecoursera/specdata/") {
setwd(directory)
lst <- list.files()
df <- rbindlist(lapply(lst, fread))
mean(!is.na(df[[pollutant]]))
}
答案 2 :(得分:0)
只是一个猜测,因为没有数据可以确认这一点,但看起来你要求标记为污染物的行的平均值,而不是列。
通常,变量保存在列中,单个观察值保存在行中。因此,移动该逗号有助于将正确的数据输入到您的计算中,为rows(observations)
提供所有column="pollutant"
。
#how the data frame is constructed df[rows, columns]
通过询问你的方式,你获得了那一行中没有NA的所有观察结果,但是您采用了整个数据框的平均值。
pollutantmean <- function(pollutant, id = 1:332, directory =
"/Users/marsh/datasciencecoursera/specdata/") {
setwd(directory)
list <- list.files()
df <- data.frame()
for(i in id) {
x <- read.csv(list[i])
df <- rbind(df,x)
}
mean(df[,pollutant], rm.na=TRUE)
}
这表示取数据框df
列pollutant
中所有观察值的平均值=非NA,这应该可以为您提供所需内容
答案 3 :(得分:0)
以上所有答案都帮助我解决了问题。
yourSearchBarVariable.keyboardAppearance = .dark
最终回复了正确的答案。谢谢!