在R中,我试图创建一个for循环,循环遍历变量名并在它们上执行函数

时间:2015-04-19 06:27:22

标签: r

我的变量名为 team.1 team.2 team.3 ,等等。

首先,我想知道如何浏览每一个并为每个数据框分配一个数据框。所以 team.1 会有来自一个团队的数据,然后 team.2 会有来自第二个团队的数据。我试图为大约30个团队做这个,所以不是输入代码30次,有没有办法通过计数器或类似的东西循环每个?

我尝试过像

这样的事情
    vars = list(sprintf("team.x%s", 1:33)))

创建我的变量,但是我没有运气给他们分配任何东西。

同样,我希望能够运行我为清理和排序所有这些数据集的功能。

为此,我尝试过for循环

    for (j in 1:33) {
      assign(paste("team.",j, sep = ""), cleaning1(paste("team.",j, sep =""), j))
    }

其中cleaning1是我的功能,有两个电话。

    cleaning1(team.1, 1)

这会产生错误消息

Error in who[, -1] : incorrect number of dimensions

所以显然我希望循环可以计算我的数据集,并输入我的函数调用并使用新清理的数据重新分配我的数据集。

这样的事情可能吗?我是一个完整的新手,所以越基本越好。

编辑:

cleaning1:

cleaning1 = function (who, year) {
  who[,-1]
  who$SeasonEnd = rep(year, nrow(who))
  who = (who[-nrow(who),])
  who = tbl_df(who)
  for (i in 1:nrow(who)) {
    if ((str_sub(who$Team[i], -1)) == "*") {
      who$Playoffs[i] = 1
      } else {
      who$Playoffs[i] = 0
      }
     }
  who$Team = gsub("[[:punct:]]",'',who$Team)
  who = who[c(27:28,2:26)]
  return(who)
  } 

当我在我自己编译的数据集上运行它时,这很好用。

要运行它,我必须通过并重新分配每个数据集,如下所示:

team.1 = cleaning1(team.1, 1)   

team.2 = cleaning1(team.2, 2)   

所以,我试图找到一种方法来自动化它的一部分。

1 个答案:

答案 0 :(得分:1)

我认为通过使用数据框列表而不是每个包含一个数据框的许多变量,可以更好地解决问题。

您没有说明从何处获取数据,因此我不确定您将如何创建列表。但假设您已将数据框存储在变量team.1等中,则可以使用

生成列表
team.list <- list(team.1, team.2, ...,team.33)

其中点代表我没有明确写出的变量(你必须这样做)。当然,这很乏味,可以简化如下

team.list <- do.call(list,mget(paste0("team.",1:33)))

paste0命令将变量名称创建为字符串,mget将它们转换为实际对象,do.calllist命令应用于这些对象。

既然您已将所有数据都放在列表中,那么在所有数据上应用函数要容易得多。我不太确定应该如何使用year参数,但是从你的例子中,我假设它只是从1到33运行(让我知道,如果这不是真的我将改变代码) 。所以以下内容应该有效:

team.list.cleaned <- mapply(cleaning1,team.list,1:33)

它将遍历team.list1:33的所有元素,并将元素作为参数应用于函数cleaning1。结果将再次是包含每个呼叫输出的列表,即

list( cleaning1(team.list[[1]],1), cleaning1(team.list[[2]],2), ...)

由于您现在是R,我强烈建议您阅读应用命令的帮助(applylapplytapplymapply)。非常有用,一旦你习惯了它们,你就会一直使用它们......

可能还有一种使用lapply直接生成数据框列表的简单方法。例如:如果从文件读入数据框并且您将文件名存储在字符向量file.names中,那么就会出现

的内容。
team.list <- lapply(file.names,read.table)

可能有用。