我的变量名为 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)
所以,我试图找到一种方法来自动化它的一部分。
答案 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.call
将list
命令应用于这些对象。
既然您已将所有数据都放在列表中,那么在所有数据上应用函数要容易得多。我不太确定应该如何使用year
参数,但是从你的例子中,我假设它只是从1到33运行(让我知道,如果这不是真的我将改变代码) 。所以以下内容应该有效:
team.list.cleaned <- mapply(cleaning1,team.list,1:33)
它将遍历team.list
和1:33
的所有元素,并将元素作为参数应用于函数cleaning1
。结果将再次是包含每个呼叫输出的列表,即
list( cleaning1(team.list[[1]],1), cleaning1(team.list[[2]],2), ...)
由于您现在是R,我强烈建议您阅读应用命令的帮助(apply
,lapply
,tapply
,mapply
)。非常有用,一旦你习惯了它们,你就会一直使用它们......
可能还有一种使用lapply
直接生成数据框列表的简单方法。例如:如果从文件读入数据框并且您将文件名存储在字符向量file.names
中,那么就会出现
team.list <- lapply(file.names,read.table)
可能有用。