在R中,我试图遍历列表的变量并从每个列表中提取一个特定的索引

时间:2015-04-22 20:37:19

标签: r loops indexing

在R中,我使用readHTMLTable来读取网络中的表格。我想要的表格出现在索引16和17,[[16]]& [[17]]

以下是您可以使用的小数据样本:

这些是包含HTML表格的一些网址。

url1 = "http://www.basketball-reference.com/leagues/NBA_1980.html"
url2 = "http://www.basketball-reference.com/leagues/NBA_1981.html"
url3 = "http://www.basketball-reference.com/leagues/NBA_1982.html"

在这里,我在表格中读到了名为x1,x2和x3的变量。

x1 = readHTMLTable(url1)
x2 = readHTMLTable(url2)
x3 = readHTMLTable(url3)

如果您查看每个summary(x1)summary(x2)summary(x3)的摘要并倒计时索引,我想要的表格就是名为" team& #34;和"对手",发生在第16行和第17行。

我一直在尝试编写一个循环,循环使用这些循环并命名"团队"表格分别来自名为team.1980team.1981team.1982的变量。 "对手"表格将遵循相同的趋势opp.1980,依此类推。

这是我一直在尝试的循环代码:

for(i in 1:3) {
  for (j in 1980:1982) {
    nam1 = paste0("team.", j)
    nam2 = paste0("opp.", j)
    assign(nam1, paste0("x.", i)[[16]])
    assign(nam2, paste0("x.", i)[[17]])
  }
}

我认为这个循环背后的理论是有效的,但问题出现在两个assign函数中:

assign(nam1, paste0("x.", i)[[16]])
assign(nam2, paste0("x.", i)[[17]])

当我运行循环时,我收到错误消息

Error in paste0("x.", i)[[16]] : subscript out of bounds

如果我刚刚运行,那就是我得到的错误:

paste0("x", 1)[[16]]

> paste0("x", 1)[[16]]
  Error in paste0("x", 1)[[16]] : subscript out of bounds

所以我很确定这就是我的问题所在。有谁知道如何循环变量并从每个变量中提取索引?

请记住,我是R的新手,所以简单性会非常感激!提前谢谢!

1 个答案:

答案 0 :(得分:1)

readHTMLTable()的输出是一个列表,元素可以按名称引用;索引是不必要的。 (虽然你可以使用它。)

假设您的帖子中定义了x1x2x3。然后你可以这样做:

for (i in 1:3) {
    year <- 1980 + i - 1
    eval(parse(text=paste0("team.", year, " <- x", i, '[["team"]]')))
    eval(parse(text=paste0("opp.", year, " <- x", i, '[["opponent"]]')))
}

这将评估在循环中动态构建的已解析文本。它创建了6个数据框:1980年至1982年的team.1980opp.1980

让我们仔细看看它在做什么......

首先使用paste0()构造一个字符串,将值连接成一个没有分隔符的字符串。在第一次迭代中对paste0()的第一次调用产生了这个字符串:

'team.1980 <- x1[["team"]]'

对此调用parse()告诉R将该字符串转换为名为 expression 的对象。可以使用eval()评估表达式。因此,此字符串将变为R语句并执行,从而分配team.1980

此过程将继续进行3次迭代。

这可能不是最好的方法,但它应该适用于您的情况。我假设你不仅仅是这6个,否则你也可以把它们写成个人作业。