在R中的for循环中对名称“i”的对象执行函数

时间:2013-05-21 16:54:02

标签: r for-loop

我仍然是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 对象,而不是 i 本身。

1 个答案:

答案 0 :(得分:0)

在你的循环中,你可以改变这个:

assign(i, read.delim(filepath, colClasses = "character", sep = ","))
i <- handlestripper(i)

tmp <- read.delim(filepath, colClasses = "character", sep = ",")
assign(i, handlestripper(tmp))

我认为您应尽可能少地进行getassign次呼叫,但使用名称为您的循环编制索引并没有错。无论如何,我一直这样做。