【问题标题】:R data selection using sapply not working使用 sapply 的 R 数据选择不起作用
【发布时间】:2014-07-04 19:09:58
【问题描述】:

我有以下代码来获取污染物平均值。该程序的数据位于文件夹 specdata 中,名称为 "001.csv", "002.csv", ... to "332.csv" 。任何一个数据的名称给出以下名称:

[1] "Date"    "sulfate" "nitrate" "ID"  

在下面的代码中,我必须计算污染物硝酸盐或硫酸盐的平均值。我认为代码是正确的。但是 data$pollutant 给了

污染平均值错误(“specdata”,“硫酸盐”,23):尝试 应用非函数

代码应该通过以下方式调用:

pollutantmean("specdata", "nitrate", 23)

我在这里做错了什么??

pollutantmean <- function(directory, pollutant, id = 1:332) {
  f <- function(num){
    if(num>=0 & num<=9){
      fname <- paste('specdata/00',as.character(num),".csv",sep="")
    }
    else if (num>=10 & num <=99){
      fname <- paste('specdata/0',as.character(num),".csv",sep="")
    }
    else{
      fname <- paste('specdata/',as.character(num),".csv",sep="")
    }
    data <- read.csv(fname)
    data <- data[complete.cases(data),]
    return(mean(data$pollutant))
  }
  results <- sapply(id, f)
  return(results)

}

【问题讨论】:

  • 与您的问题无关,但有用的提示:运行sprintf("%03.f", 1:322)
  • 啊,谢谢!这本可以在上面循环中救我。我正在学习 R。这是一种很好的捷径。谢谢
  • 次要观点:您还硬编码"specdata/",并且从不使用directory

标签: r csv


【解决方案1】:

您遇到的错误很可能是由调用data$pollutant 引起的。你有pollutant="nitrate",它是一个字符串,在这种情况下$ 的引用将不起作用。请改用[],这是一个最小的示例:

df <- data.frame(hello=1:3, world=5)
name <- "hello"
df$name
NULL
df[name]
#  hello
#1     1
#2     2
#3     3

【讨论】:

  • 谢谢,这就是问题所在。但检查 df$"hello" 是否仍然提供数据。所以,我很困惑。
  • 请告诉我 df$"hello" 如何给出答案,但 df$name 没有
  • df$name 被解释为“搜索列名称以查找类似‘name’的内容”,因此没有实际查找变量 name。有关详细信息,请参阅this 答案。
猜你喜欢
  • 2017-10-24
  • 1970-01-01
  • 2012-07-27
  • 2017-04-21
  • 2013-09-02
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多