0

我对 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)]
}

这一切都很好。当我尝试handlestripper()在 for 循环中执行该函数时,问题就来了。

# 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. 我知道这意味着我的函数正在应用于我从 vector 中调用的字符串data_names,但我不知道如何告诉 R 在我的 for 循环的最后一行中,我希望将函数应用于我刚刚使用 assign 命令创建的名为i的对象,而不是i本身。

4

1 回答 1

0

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

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

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

我认为您应该尽可能少地调用getassign调用,但是像您正在做的那样用名称索引您的循环并没有错。无论如何,我一直都这样做。

于 2013-05-21T20:45:02.963 回答