【问题标题】:Executing function on objects of name 'i' within for-loop in R在R中的for循环中对名称为'i'的对象执行函数
【发布时间】: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 命令创建的名称为 iobjects,而不是应用于 i 本身。

【问题讨论】:

  • 我有点惊讶您的assign 调用没有引发错误。更一般地说,为什么不循环遍历索引而不是值?
  • 你在搞乱循环索引,它是一个 R 对象。看起来是不好的做法。可能更容易使用sapply
  • get 可能会解决问题...就像handlestripper(get(i))... 但我认为 DWin 和 joran 指出了一些应该解决的更大问题!
  • @joran 我该怎么做呢?感谢您的帮助。
  • 我想到了类似for (i in seq_along(data_names)) 的东西,然后您可以通过data_names[i] 访问相应的元素。但是sapply 将是另一个不错的选择。更一般地说,我建议您避免使用assign

标签: r for-loop


【解决方案1】:

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

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

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

我认为你应该尽可能少地调用getassign,但是用你正在做的名字来索引你的循环并没有错。不管怎样,我一直都这样做。

【讨论】:

  • 几乎 - 我的代码的最后一行现在读取assign(i, handlestripper(tmp)),因此循环输出是名称为 i 的数据帧。
  • 糟糕,我错误地复制了自己的建议! :) 感谢您指出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
相关资源
最近更新 更多