2

使用 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代码都会很棒,并且使用和/或分析大量信息的最佳实践的想法将是无价的。

4

2 回答 2

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 放在一个 list 中,然后处理它们。

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
于 2013-01-02T09:47:31.493 回答
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 中以供分析。

于 2013-01-02T09:39:44.153 回答