基于另外两个数据框创建一个额外的列

时间:2021-01-09 16:09:26

标签: r dplyr

我有三个数据集

一个包含大量关于风暴的信息。

一个包含城市全名和缩写的。

还有一个包含每个州的年份和人口。

我想要做的是在第一个数据框风暴中添加一个列,称为人口,其中包含使用其他两个数据框 state_codes 和 states 的每个州每年的人口。

谁能指出我正确的方向?下面是一些示例数据

> head(storms)
  num   yr mo dy     time state magnitude injuries fatalities crop_loss
1   1 1950  1  3 11:00:00    MO         3        3          0         0
2   1 1950  1  3 11:10:00    IL         3        0          0         0
3   2 1950  1  3 11:55:00    IL         3        3          0         0
4   3 1950  1  3 16:00:00    OH         1        1          0         0
5   4 1950  1 13 05:25:00    AR         3        1          1         0
6   5 1950  1 25 19:30:00    MO         2        5          0         0

> head(state_codes)
        Name Abbreviation
1    Alabama           AL
2     Alaska           AK
3    Arizona           AZ
4   Arkansas           AR
5 California           CA
6   Colorado           CO


head(states)
Year Alabama Arizona Arkansas California Colorado Connecticut Delaware
1 1900    1830     124     1314       1490      543         910      185
2 1901    1907     131     1341       1550      581         931      187
3 1902    1935     138     1360       1623      621         952      188
4 1903    1957     144     1384       1702      652         972      190
5 1904    1978     151     1419       1792      659         987      192
6 1905    2012     158     1447       1893      680        1010      194

2 个答案:

答案 0 :(得分:1)

您没有提供太多数据进行测试,但这应该可以。

首先,将 version: '3' services: backend: image: backend:latest restart: always env_file: - ./envs/dev.env command: 'sh /scripts/dev.sh' ports: - "9000:9000" 连接到 storms,以便它具有 state_codes 中的状态名称。我们可以同时重命名 states 以匹配 yr

然后将 states$Year 转为长格式。

最后,将新版 states 加入长版 storms

states

答案 1 :(得分:0)

这个答案不使用 dplyr,但我提供它是因为我知道它在大型数据集上非常快。

它遵循与接受的答案相同的第一步:将州名合并到风暴数据集中。但后来它做了一些聪明的事情(我偷了这个想法):它创建了一个行号和列号的矩阵,然后使用它从“状态”数据集中提取新列所需的元素。

#Add the state names to storms
storms<-merge(storms, state_codes, by.x = 6, by.y = 2, all.x = T)

#Get row and column indexes for the elements in 'states'
r<-match(storms$year, states$year)
c<-match(storms$state.y, names(states)) #state.y was the name of the merged column
smat<-cbind(r,c)

#And grab them into a new vector
storms$population<-states[smat]
相关问题