反复根据R中的索引值将数据集的相同部分与数据集的其他部分进行比较

问题描述 投票:0回答:1

我有一个如下所示的数据框:

state  year  value
1      1980  4
1      1981  5
1      1982  4
2      1980  2
2      1981  3
2      1982  4
100    1980  3
100    1981  2
100    1982  5

在实际数据集中,状态多于此处显示的状态。我想在状态100和所有其他状态之间进行比较。

[具体地说,对于每个州,我想找出该州在特定年份给出的值与在同一年份为州100给出的值之间的差。下面,我展示了如何比较状态1和状态100之间的1980年的值。

df_1 <- df %>% filter(state == 1) 
df_100 <- df %>% filter(state == 100)
df_1_1980 <- df_1 %>% filter(year == 1980) 
df_100_1980 <- df_100 %>% filter(year == 1980)
difference <- df_1_1980$value - df_100_1980$value

我如何才能针对数据框中的所有其他州和年份执行此操作?

我考虑过的一种可能性是制作一个仅由状态100的数据组成的数据帧,然后将其连接到原始数据帧,如下所示:

state  year  value  state100  year100  value100
1      1980  4      100       1980     3
1      1981  5      100       1981     2
1      1982  4      100       1982     5
2      1980  2      100       1980     3
2      1981  3      100       1981     2
2      1982  4      100       1982     5

然后我可以从df $ value100的每一行中减去df $ value。我认为有更好的方法可以做到这一点。

我有一个如下所示的数据框:州年值1 1980 4 1 1981 5 1 1982 4 2 1980 2 2 1981 3 2 1982 4 100 1980 3100 1981 2 100 ...

r loops dplyr apply tidyverse
1个回答
0
投票
library(dplyr) df %>% filter(state != 100) %>% left_join(df %>% filter(state == 100) %>% select(-state), by = c('year')) %>% transmute(state, year, value = value.x, difference = value.x - value.y) # state year value difference #1 1 1980 4 1 #2 1 1981 5 3 #3 1 1982 4 -1 #4 2 1980 2 -1 #5 2 1981 3 1 #6 2 1982 4 -1
© www.soinside.com 2019 - 2024. All rights reserved.