如何使用表格列表

时间:2013-01-02 09:23:54

标签: r xml list web-scraping

使用XML包我可以从网站上抓取80个表,这个数字也会随着时间的推移而增长。他们自己的表不是很大,大多是6x10(这个大小在不同的表和时间之间也不同)。兑换的事实是99%的时间表将具有相同的列,即列名。例如:

 table[1]
 A B C D E F
 1 b b 2 2 b
 2 b b 2 2 b 


 table[2]
 A B C D E F
 1 c c 2 2 c
 2 c c 2 2 c 

我如何将所有表及其观察结果组合成单独的变量(每列=变量),同时确保每个变量中的观察结果保持其与原始表的链接(例如,通过附加变量)。

由于不同的表格参考了比赛中不同轮次的结果,我希望实现的最终结果是能够在任何一年的不同比赛中跟踪个人在比赛中的进展情况(我希望能抓很多桌子。)

任何人都可以传递的任何好的 R 代码都会很棒,而且使用和/或分析这些大量信息的最佳实践的想法将是非常宝贵的。

2 个答案:

答案 0 :(得分:2)

在发布之前我没有看到@flodel解决方案,但使用基础包的想法是一样的。

dat1 <- read.table(text = '
A B C D E F
1 b b 2 2 b
2 b b 2 2 b',header=T)

dat2 <- read.table(text ='
A B C D E F
1 c c 2 2 c
2 c c 2 2 c',header=T)

想法是将所有data.frames放在一个列表中,并对其进行处理。

ll <- list(dat1,dat2)   ## I assume your table in a list 
ll <- lapply(seq_along(ll),function(i)cbind(ll[[i]],id = i))
do.call(rbind,ll)

  A B C D E F id
1 1 b b 2 2 b  1
2 2 b b 2 2 b  1
3 1 c c 2 2 c  2
4 2 c c 2 2 c  2

我认为您不需要将所有内容放在大数据框中,您可以在列表中对待它们。 例如:

ll <- lapply(ll,function(dat){
  sum(rank(dat))  ## dummy rank function 
})

您会得到每轮的分数列表

 ll
[[1]]
[1] 105

[[2]]
[1] 105

答案 1 :(得分:1)

两件事:

1)为每个表添加一个ID列:

tables <- lapply(seq_along(tables), function(i) transform(tables[[i]], ID = i))

2)绑定/对齐可能没有所有相同列的列,请使用plyr::rbind.fill

library(plyr)
all.data <- do.call(rbind.fill, tables)

你得到的是一个包含所有数据的data.frame。要像你问的那样创建“单独的变量”,你可以使用attach(all.data),但实际上并不推荐。最好将数据保存在data.frame中以供分析。