【发布时间】:2013-05-16 12:57:45
【问题描述】:
我对 R 还是很陌生,对 for 循环和函数也很陌生,但是我在 stackoverflow 上搜索了很多,但找不到这个问题的答案。所以我们开始吧。
我正在尝试创建一个脚本,该脚本将 (1) 读取多个 .csv 文件并 (2) 应用一个函数来从 url 中删除 twitter 句柄并对这些文件执行一些其他操作。我已经为这两个任务分别开发了脚本,所以我知道我的大部分代码都可以工作,但是当我尝试将它们结合起来时出现了问题。我准备使用以下代码这样做:
# specify directory for your files and replace 'file' with the first, unique part of the
# files you would like to import
mypath <- "~/Users/you/data/"
mypattern <- "file+.*csv"
# Get a list of the files
file_list <- list.files(path = mypath,
pattern = mypattern)
# List of names to be given to data frames
data_names <- str_match(file_list, "(.*?)\\.")[,2]
# Define function for preparing datasets
handlestripper <- function(data){
data$handle <- str_match(data$URL, "com/(.*?)/status")[,2]
data$rank <- c(1:500)
names(data) <- c("dateGMT", "url", "tweet", "twitterid", "rank")
data <- data[,c(4, 1:3, 5)]
}
一切正常。当我尝试在 for 循环中执行函数 handlestripper() 时,问题就来了。
# Read in data
for(i in data_names){
filepath <- file.path(mypath, paste(i, ".csv", sep = ""))
assign(i, read.delim(filepath, colClasses = "character", sep = ","))
i <- handlestripper(i)
}
当我执行此代码时,我收到以下错误:Error in data$URL : $ operator is invalid for atomic vectors。我知道这意味着我的函数正在应用于我从向量data_names 中调用的字符串,但我不知道如何告诉 R,在我的 for 循环的最后一行中,我想要这个函数应用于我刚刚使用 assign 命令创建的名称为 i 的 objects,而不是应用于 i 本身。
【问题讨论】:
-
我有点惊讶您的
assign调用没有引发错误。更一般地说,为什么不循环遍历索引而不是值? -
你在搞乱循环索引,它是一个 R 对象。看起来是不好的做法。可能更容易使用
sapply。 -
get可能会解决问题...就像handlestripper(get(i))... 但我认为 DWin 和 joran 指出了一些应该解决的更大问题! -
@joran 我该怎么做呢?感谢您的帮助。
-
我想到了类似
for (i in seq_along(data_names))的东西,然后您可以通过data_names[i]访问相应的元素。但是sapply将是另一个不错的选择。更一般地说,我建议您避免使用assign。