我有一个 R 数据框,使用 XML 包中的 readHTMLTable() 从互联网上爬取。表格如下所示,包含多个人口和年份的变量/列。(请注意,年份在列之间不重复,并且代表人口的唯一标识符。)
我想将数据重新组织成只有两列,一列为年份,一列为人口,格式如下:
变量/列
我考虑了以下事项:
(1)循环遍历人口和年份列(
(2)我尝试过下面的融合(melt),但它可能无法处理跨多个列分割的id变量,或者我没有正确实施。
最后,我考虑将每个年份列作为自己的向量提取出来,并将这些向量附加在一起,如下所示:
然而,上述代码对于year.all返回以下结果。
这不是,而是
如果有一种简单明了的方法来完成这个重组,我很愿意学习。非常感谢您的帮助。
year1 pop1 year2 pop2 year3 pop3
1
2 16XX 4675,0 1900 6453,0 1930 9981,2
3 17XX 4739,3 1901 6553,5 1931 ...
4 17XX 4834,0 1902 6684,0 1932
5 180X 4930,0 1903 6818,0 1933
6 180X 5029,0 1904 6955,0 1934
7 181X 5129,0 1905 7094,0 1935
8 181X 5231,9 1906 7234,7 1936
9 182X 5297,0 1907 7329,0 1937
10 182X 5362,0 1908 7422,0 1938
我想将数据重新组织成只有两列,一列为年份,一列为人口,格式如下:
year pop
1
2 16XX 4675,0
3 17XX 4739,3
4 17XX 4834,0
5 180X 4930,0
6 180X 5029,0
7 181X 5129,0
8 181X 5231,9
9 182X 5297,0
10 182X 5362,0
11 1900 6453,0
12 1901 6553,5
13 1902 6684,0
... ... ...
21 1930 9981,2
22 ...
变量/列
year2
和year3
的值以下附加到year1
,相应的人口值也是如此。我考虑了以下事项:
(1)循环遍历人口和年份列(
n>2
),并将这些值作为新观测添加到year1和population1中可以工作,但这似乎过于繁琐。(2)我尝试过下面的融合(melt),但它可能无法处理跨多个列分割的id变量,或者我没有正确实施。
df.melt <- melt(df, id=c("year1", "year2",...)
最后,我考虑将每个年份列作为自己的向量提取出来,并将这些向量附加在一起,如下所示:
year.all <- c(df$year1, df$year2,...)
然而,上述代码对于year.all返回以下结果。
[1] 1 2 3 3 4 4 5 5 6 6 7 8 8 9 9 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 1 1 2 ...
这不是,而是
[1] 16XX 17XX 17XX 180X 180X 181X 181X 182X 182X 1900 1901 1902...
如果有一种简单明了的方法来完成这个重组,我很愿意学习。非常感谢您的帮助。
patterns()
是否随着data.table
包一起提供?我收到以下错误信息:Error in melt.data.table(setDT(table), measure = patterns("^year", "^population"), : could not find function "patterns"
,尽管我使用了以下命令install.packages(data.table)
、library(data.table)
和require(data.table)
。 - user2489854