在R

时间:2015-11-24 14:27:00

标签: r csv for-loop web-scraping

我有以下name_total = matrix(nrow = 51, ncol=3, NA),其中每一行对应一个州(51为哥伦比亚特区)。第一列是一个给出状态名称的字符串(例如:name_total[1,1]= "Alabama")。 第二个和第三个是来自人口普查的CSV文件的网址,分别将县与州参议院区和县与州府区连接起来。

阿拉巴马州:

name_total[1,2] ="http://www2.census.gov/geo/relfiles/cdsld13/01/co_lu_delim_01.txt"
name_total[1,3] ="http://www2.census.gov/geo/relfiles/cdsld13/01/co_ll_delim_01.txt"

我希望最终输出一个表格,基本上是所有50个州+ DC及其各自的县并连接参议院和众议院地区。我不知道这是否非常清楚所以这里有一个例子:

       [,1]        [,2]             [,3]                [,4]              
[1,] "Alabama"  "countyX1"  "Senate District Y1"  "House District Z1"
[2,] "Alabama"  "countyX2"  "Senate District Y2"  "House District Z2"
[3,] "Alabama"  "countyX3"  "Senate District Y3"  "House District Z3"
[4,] "Alaska"   "countyX4"  "Senate District Y4"  "House District Z4"
[5,] "Alaska"   "countyX5"  "Senate District Y4"  "House District Z5"

我使用for循环:

for (i in 1:51){
  senate= name_total[i,2]
  link_senate = url(senate) 
  house= name_total[i,3]
  link_house = url(house) 
  state=name_total[i,1]
  data_senate= read.csv2(link_senate,sep=",",header=TRUE, skip=1)
  data_house= read.csv2(link_house,sep=",",header=TRUE, skip=1)
  final=cbind(state, data_senate, data_house)
}

当然每个元素都有不同的行数,对于Alabama(i = 1)状态返回“Alabama”一次,其他元素分别返回3乘122和3乘207矩阵。我收到有关行数变化的错误消息。

我很确定其中一个问题是cbind函数的使用,但我不知道如何使用它来获得更好的结果。

1 个答案:

答案 0 :(得分:0)

如果其他人有类似的问题,我找到了一种方法来获得我想分别为州参议院和州议会提出的要求。首先,一些国家只有两个国家,而俄勒冈州的联系也在下降。我个人从原始数据中取出它们。

然后我在循环之外初始化了第一个状态:

senate = url(name_total[1,2])
data_senate= read.csv2(senate,sep=",",header=TRUE, skip=1)
assign(paste("Base_senate_",name_total[1,1],sep=""),data_senate)
A = assign(paste("Base_senate_",name_total[1,1],sep=""),data_senate)

house= url(name_total[1,3])
data_house= read.csv2(house,sep=",",header=TRUE, skip=1)
assign(paste("Base_house_",name_total[1,1],sep=""),data_house)
B = assign(paste("Base_house_",name_total[1,1],sep=""),data_house)

然后我使用for循环:

for (i in 2:48){
  senate = url(name_total[i,2]) 
  house= url(name_total[i,3])
  data_senate= read.csv2(senate,sep=",",header=TRUE, skip=1)
  assign(paste("Base_senate_",name_total[i,1],sep=""),data_senate)
  names(data_senate)[2] = "County"
  A = rbind(A,assign(paste("Base_senate_",name_total[i,1],sep=""),data_senate))
  data_house= read.csv2(house,sep=",",header=TRUE, skip=1)
  assign(paste("Base_house_",name_total[i,1],sep=""),data_house)
  names(data_house)[2] = "County"
  B = rbind(B,assign(paste("Base_house_",name_total[i,1],sep=""),data_house))
}

A和B为您提供了预期的表(没有State的字符串名称,但第一个变量标识了状态)。

我不得不使用names(data_senate)[2] = "County"因为第二列对某些州有不同的名称。

希望它有所帮助!