2013-01-02 44 views
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任何人都可以傳遞的代碼將會很棒,而利用和/或分析這些信息的最佳實踐的想法將是非常寶貴的。

+0

想想你會發現'合併()'函數是有用的。 – Jochem

回答

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),但實際上並不推薦。您最好將數據保存在數據框中進行分析。

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 

我覺得你並不需要把所有在一個大data.frame,您可以在列表中對待他們。 例如:

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

你得到的分數列表每輪

ll 
[[1]] 
[1] 105 

[[2]] 
[1] 105 
相關問題