如何在数据框列表中添加具有特定值的列

问题描述:

我一直在寻找设置一个简单的代码来从网络上抓取数据。结果是列表中的数据帧列表。我想要做的是为每个数据框添加特定的信息,以便之后绑定它们。如何在数据框列表中添加具有特定值的列

下面是代码

page_numbers <- c(123, 124, 125, 126)

urls <- paste("http://www.abstimmungen.bl.ch/de/vote/detail/", page_numbers, sep = "") 

Data <- lapply(urls, function(x){readHTMLTable(getURL(x),stringsAsFactors=F)}) 

没有什么让我分辨型动物dataframes。所以我觉得做名的列表如下

Title <- list("Bruderholz-Initiative", "Lehrpersonen-Initiative", "Abschaffung Amtszeitbeschränkung", "Aufgabenzuordnung BL-Gemeinden") 

我想在同一列变量添加到所有数据帧,称为标题,并用一个循环增加对他们每个人的具体数值。

for(i in Data){ 
    Data[[i]]$Titre <- rep(Titre[i], 
         nrow(as.data.frame(Data[[i]])) 
         )} 

结果是由于错误的指令而导致的错误。 另外,我曾经尝试这样做其它的代码

Data2 <- Map(transform , Data, Titres = Titre[i]) 

我实在看不出如何纠正我的代码,使其工作,我只能猜测,我的名单的结构出现问题了。任何帮助真的很受欢迎 在此先感谢!

OP的目标是为每个数据帧添加特定信息,以便之后绑定它们。

由OP提供的样本数据表明,它只是一个项目,Title,应该添加,大概是为了以后的分组。如果是这样的情况下,存在在手使用rindlist()data.table封装的简单的解决方案,其 “人名” 的行而结合:

# remove one list level to get a list of data.frames 
# (as already suggested by the OP) 
Data1 <- unlist(Data, recursive = FALSE) 
# name the list elements 
Data1 <- setNames(Data1, Title) 
str(Data1) 
List of 4 
$ Bruderholz-Initiative   :'data.frame': 91 obs. of 9 variables: 
    ..$ Bezirk : chr [1:91] "Bezirk Arlesheim" "Aesch" "Allschwil" "Arlesheim" ... 
    ..$ Resultat : chr [1:91] "abgelehnt11680" "abgelehnt" "abgelehnt" "abgelehnt" ... 
    ..$ Ja  : chr [1:91] "15433" "840" "1473" "727" ... 
    ..$ Nein  : chr [1:91] "27159" "1606" "3513" "1982" ... 
    ..$ Leer  : chr [1:91] "864" "38" "121" "75" ... 
    ..$ Ungültig: chr [1:91] "758" "18" "179" "59" ... 
    ..$ Ja%  : chr [1:91] "36.23" "34.34" "29.54" "26.84" ... 
    ..$ Nein% : chr [1:91] "63.77" "65.66" "70.46" "73.16" ... 
    ..$ Gemeldet : chr [1:91] "15 von 15" "ja" "ja" "ja" ... 
$ Lehrpersonen-Initiative   :'data.frame': 91 obs. of 9 variables: 
[...] 
$ Abschaffung Amtszeitbeschränkung:'data.frame': 91 obs. of 9 variables: 
[...] 
$ Aufgabenzuordnung BL-Gemeinden :'data.frame': 91 obs. of 9 variables: 
[...] 
library(data.table) 
# combine all rows, thereby creating an id column Title containing 
# the names of the list elements 
DT <- rbindlist(Data1, idcol = "Title") 
DT 
       Title   Bezirk  Resultat Ja Nein Leer Ungültig Ja% Nein% Gemeldet 
    1:   Bruderholz-Initiative Bezirk Arlesheim abgelehnt11680 15433 27159 864  758 36.23 63.77 15 von 15 
    2:   Bruderholz-Initiative   Aesch  abgelehnt 840 1606 38  18 34.34 65.66  ja 
    3:   Bruderholz-Initiative  Allschwil  abgelehnt 1473 3513 121  179 29.54 70.46  ja 
    4:   Bruderholz-Initiative  Arlesheim  abgelehnt 727 1982 75  59 26.84 73.16  ja 
    5:   Bruderholz-Initiative  Biel-Benken  abgelehnt 565 575 23  20 49.56 50.44  ja 
---                             
360: Aufgabenzuordnung BL-Gemeinden  Niederdorf  angenommen 298 85 15   4 77.81 22.19  ja 
361: Aufgabenzuordnung BL-Gemeinden   Oberdorf  angenommen 416 119 27   4 77.76 22.24  ja 
362: Aufgabenzuordnung BL-Gemeinden  Reigoldswil  angenommen 333 65 23   7 83.67 16.33  ja 
363: Aufgabenzuordnung BL-Gemeinden  Titterten  angenommen 122 28 9   4 81.33 18.67  ja 
364: Aufgabenzuordnung BL-Gemeinden  Waldenburg  angenommen 158 45 23   4 77.83 22.17  ja 

F或完整的缘故,也有其他的方法前一个id列添加到单个数据行绑定:

在原来的,嵌套列表:

Data0 <- lapply(seq_along(Data), function(.i) cbind(Data[[.i]][[1]], Title = Title[[.i]])) 
str(Data0[1]) 
List of 1 
$ :'data.frame': 91 obs. of 10 variables: 
    ..$ Bezirk : chr [1:91] "Bezirk Arlesheim" "Aesch" "Allschwil" "Arlesheim" ... 
    ..$ Resultat : chr [1:91] "abgelehnt11680" "abgelehnt" "abgelehnt" "abgelehnt" ... 
    ..$ Ja  : chr [1:91] "15433" "840" "1473" "727" ... 
    ..$ Nein  : chr [1:91] "27159" "1606" "3513" "1982" ... 
    ..$ Leer  : chr [1:91] "864" "38" "121" "75" ... 
    ..$ Ungültig: chr [1:91] "758" "18" "179" "59" ... 
    ..$ Ja%  : chr [1:91] "36.23" "34.34" "29.54" "26.84" ... 
    ..$ Nein% : chr [1:91] "63.77" "65.66" "70.46" "73.16" ... 
    ..$ Gemeldet : chr [1:91] "15 von 15" "ja" "ja" "ja" ... 
    ..$ Title : Factor w/ 1 level "Bruderholz-Initiative": 1 1 1 1 1 1 1 1 1 1 ... 

或在“扁平”列表中:

Data1 <- unlist(Data, recursive = FALSE) 
Data2 <- lapply(seq_along(Data1), function(.i) cbind(Data1[[.i]], Title = Title[[.i]])) 
str(Data2[1]) 
List of 1 
$ :'data.frame': 91 obs. of 10 variables: 
    ..$ Bezirk : chr [1:91] "Bezirk Arlesheim" "Aesch" "Allschwil" "Arlesheim" ... 
    ..$ Resultat : chr [1:91] "abgelehnt11680" "abgelehnt" "abgelehnt" "abgelehnt" ... 
    ..$ Ja  : chr [1:91] "15433" "840" "1473" "727" ... 
    ..$ Nein  : chr [1:91] "27159" "1606" "3513" "1982" ... 
    ..$ Leer  : chr [1:91] "864" "38" "121" "75" ... 
    ..$ Ungültig: chr [1:91] "758" "18" "179" "59" ... 
    ..$ Ja%  : chr [1:91] "36.23" "34.34" "29.54" "26.84" ... 
    ..$ Nein% : chr [1:91] "63.77" "65.66" "70.46" "73.16" ... 
    ..$ Gemeldet : chr [1:91] "15 von 15" "ja" "ja" "ja" ... 
    ..$ Title : Factor w/ 1 level "Bruderholz-Initiative": 1 1 1 1 1 1 1 1 1 1 ... 

没有for循环才能完成任务。

请注意,cbind()已默认为Title。可以通过在cbind()的调用中包含参数stringsAsFactors = FALSE来关闭此功能。

这两种方法都返回data.frames的列表,它可以通过

do.call(rbind, Data0) 

rbindlist(Data0) 

直接结合逐行为了避免增加的问题标题后,为什么不加标题内的应用循环当我们逐个读取url时,则rbind,请参阅:

library(XML) 
library(RCurl) 

page_numbers <- c(123, 124, 125, 126) 
Title <- c("Bruderholz-Initiative", "Lehrpersonen-Initiative", 
      "Abschaffung Amtszeitbeschränkung", "Aufgabenzuordnung BL-Gemeinden") 

Data <- 
    do.call(rbind, 
      lapply(seq(page_numbers), 
       function(x){ 
        myURL <- paste("http://www.abstimmungen.bl.ch/de/vote/detail/", page_numbers[x], sep = "") 
        # above is returning a list, so take the first one... 
        dd <- readHTMLTable(getURL(myURL), stringsAsFactors = FALSE)[[1]] 
        dd$Title <- Title[x] 
        # return 
        dd 
       }) 
)