【发布时间】:2018-01-25 21:55:14
【问题描述】:
R 新手,所以可能是一个菜鸟问题。考虑以下代码,尤其是 for 循环:
library(lubridate)
#Read in all site files in the directory
sitefiles <- list.files(pattern = "\\.csv$") #Get a list of all csv's in dir
sites <- list() #Create an empty list.
sites <- lapply(sitefiles, read.csv)
names(sites) <- gsub("\\.csv$", "", sitefiles) #Rename the list
for (site in names(sites)){
site$time <- dmy_hms(site$timestamp)
#Error: $ operator is invalid for atomic vectors
}
好的,让我们试试这个:
for (site in sites){
site$time <- mdy_hms(site$timestamp)
}
它似乎对sites 列表中的数据框什么都不做。特别是命令 colnames(sites[[1]]) 在运行 for 循环之前和之后是相同的 - 没有添加任何列。
但是,发生了变化。 Rstudio 告诉我有一个新变量,一个名为site 的数据框,它确实添加了列时间。什么鬼???
这里发生了什么?如何成功执行此命令?
【问题讨论】:
-
site还不是一个对象。此外,sites是一个列表。因此,您必须lapply而不是循环。 -
您希望在
for循环中使用sites[[site]]$time <- dmy_hms(site$timestamp)而不是site$time <- dmy_hms(site$timestamp)。查看this post 及其包含的链接以进行更长时间的讨论。帮助文件?"["也值得阅读 2 或 3 次。 -
您必须提供
str(sites)的输出。如果您之前运行该行,names(sites) <- gsub("\\.csv$", "", sitefiles)您将获得一个命名列表。for循环遍历这些名称,sites[[site]]将引用具有给定名称的列表元素。该行实际上应该是sites[[site]]$time <- dmy_hms(sites[[site]]$timestamp)。我错过了对site$的第二次引用。也许您正试图在for循环之外运行此行?如果您在全局环境中有一个名为 site 的对象,该对象是您在帖子中提到的列表,这将导致您看到的错误。 -
@Dirk,我添加了一个包含
lapply解决方案的答案。由于您的示例没有提供可重现的示例,您可以检查它是否有效。否则,我可以改进它。 -
@loki 谢谢。它有效!