如何从其余列中减去列的子集

时间:2019-05-01 18:22:13

标签: r

我有一个包含3个重要变量的数据框。变量是CountryName,year和Idealpoint。我要尝试做的是找出给定年份中美国与任何单个国家之间理想点的差异。因此,例如,我想计算1993年美国和克罗地亚之间的理想点差。如何将美国年度理想点作为子集,并从中减去所有其他国家/地区的数据?

这是数据的样子

    year       Idealpoint    CountryName             

 1  1991       2.98 United States of America
 2  1992       3.00 United States of America
 3  1993       2.97 United States of America
 4  1994       3.00 United States of America
 5  1995       3.11 United States of America
 6  1996       3.12 United States of America
 7  1997       2.99 United States of America
 8  1998       2.72 United States of America
 9  1999       2.51 United States of America
10  2000       2.56 United States of America

还有其他行具有不同的国家名称,例如克罗地亚,瑞典等...

我尝试创建仅具有US理想点数的子集向量,并从上述数据的子集中减去没有US数据的子集向量。问题在于,并非每个国家每年都有理想的起点,因为在某些情况下该国家并不存在。因此,US理想点向量的长度不是非US向量的长度的倍数。我该如何解决?

理想情况下,我希望看到的是这样的东西(只是一个例子,不是我期望的实际结果)

    year       Idealpoint    CountryName   DifIdealUS      

 1  1991       2.98            Latvia      1
 2  1992       3.00            Latvia      1.2    
 3  1993       2.97            Latvia      1.3
 4  1994       3.00            Latvia      1
 5  1995       3.11            Latvia      1.1
 6  1996       3.12            Latvia      1.2
 7  1997       2.99            Latvia      1.3
 8  1998       2.72            Latvia      1.6
 9  1999       2.51            Latvia      1.7
10  2000       2.56            Latvia      1.6

2 个答案:

答案 0 :(得分:4)

我们可以做到

library(dplyr)
df1 %>% 
   group_by(year) %>% 
   mutate(DifIdealUS = Idealpoint - 
                       Idealpoint[CountryName == 'United States of America'])

或者另一个选择,如果所有“ CountryName”中的“ year”值都相同且在order中,则

df1$DifIdealUS <- df1$Idealpoint - 
        df1$Idealpoint[df1$CountryName == "United States of America"]

答案 1 :(得分:1)

执行此操作的更可靠的方法可能是将USA数据提取到新的数据框中,然后按年份将其加入df1中。然后,您可以使用上面的mutate函数创建新列,而无需进行分组调用-只需从Idealpoint列中减去USA数据即可。

相关问题