我对 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本身。