【问题标题】:Learning for loops in R and can't pull out a specific variable在 R 中学习 for 循环并且无法提取特定变量
【发布时间】:2014-05-19 17:39:11
【问题描述】:

在 Python 学习了一段时间后,我无法弄清楚 R 中的 for 循环。我想做的是从这段代码返回的 CSV 文件的向量中提取 $nitrate 或 $Sulfate:

getpollutant <- function(id=1:332, directory, pollutant) {
        data<-c()
        for (i in id) {
                data[i]<- c(paste(directory, "/",formatC(i, width=3, flag=0),".csv",sep=""))     
        }
        df<-c()
        for (d in 1:length(data)){ df[[d]]<-c(read.csv(data[d]))

        }
        df               
}

我还没有包含污染物的 for 循环,我尝试了许多不同的方法,但无法让它完全正常工作......我可以输入上面的代码:getpollutant(1:10, “specdata”),它将为我提供 specdata 目录中标签为 001 到 010 的所有 csv 文件,它将每个 csv 文件以分隔的块形式吐出,标题格式为 [[i]]$columnname 和列的内容下面列出。我想要做的是提取一个特定的列名(污染物)并从每个 csv 文件中返回该列的内容。我已经阅读了帮助页面,但似乎无法正确设置格式...

@RomanLuštrik 我不知道这是否是您要查找的内容,但如果我输入,这是一个示例输出

getpollutant(1, "specdata"):             
[[1]]                                                                    
[[1]]$Date                                                             
[1] 2003-01-01 2003-01-02 2003-01-03                                     
[[1]]$sulfate                                                          
[1] NA NA NA NA NA NA 7.210 NA NA NA 1.300                           
[[1]]$nitrate                                                          
[1] NA NA NA .474 NA NA NA .964 NA NA NA         

显然这是输出的一个非常小的版本,但基本上它获取指定范围 id 中的 CSV 文件并像这样打印出来......

【问题讨论】:

  • 这是针对 Coursera 课程“R 编程”的吗?
  • 你能举一个小的、可重现的例子吗?
  • @Jaap 是的,我意识到我上周落后了。在我继续之前只是想了解......
  • 欢迎来到 StackOverflow。请阅读有关如何ask a question 以及如何生成minimal reproducible example 的信息。您可能还想阅读open letter to students with homework problems
  • 您还可以在此站点上搜索“[r] 污染物”以查看人们针对此家庭作业提出/回答的所有其他问题。

标签: r csv for-loop


【解决方案1】:

您只想从文件中读取特定列吗?你知道它是哪一列的数字(例如第三列)吗?在这种情况下,您可以使用read.table/read.csvcolClasses 参数来指定只在给定列中读取。

如果您提前不知道它是哪一列,那么您可能需要读入整个文件,然后只返回给定的列。在这种情况下,您可能希望使用 [[]] 子集而不是 $ 子集。

您还可以通过使用sprintflapplysapply 使您的代码更紧凑并且可能更高效。

考虑这段代码:

lapply(1:332, function(id) {
  read.csv( sprint("%s/%03d.csv", directory, id )
})

sapply( list.files(directory, pattern='\\.csv$',full.names=TRUE), 
  function(nm) read.csv(nm)[[pollutant]] )

【讨论】:

  • 感谢您的回答,但这超出了我在 R 中的范围,我刚刚开始编写函数,我正在尝试了解 for 循环是如何工作的。这种语言比 python 更神秘,所以我真的很想了解基础知识,然后再抛出我不理解的代码。我确实知道我想读哪一列,所以我会回去查看 colClasses 参数,看看我是否可以绕开它
  • @user3653647,好的,把这段代码放在后面,直到你准备好。使用colClasses,您可以提供与数据中的列数相同的向量,向量中NULL 的任何元素都意味着跳过文件中的相应列。
猜你喜欢
  • 1970-01-01
  • 2019-11-08
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
相关资源
最近更新 更多