在两个数据集

时间:2016-08-17 19:19:04

标签: r merge

我正在尝试按年份和国家/地区合并两个数据集。第一个数据集(df = GNIPC)代表1980年至2008年期间每个国家的人均国民总收入。

         Country  Year GNIpc
       (chr) (dbl) (dbl)
1    Afghanistan  1990    NA
2    Afghanistan  1991    NA
3    Afghanistan  1992  2010
4    Afghanistan  1993    NA
5    Afghanistan  1994 12550
6    Afghanistan  1995    NA

第二个数据集(df =制裁)代表了从1946年到现在实施的经济制裁。

      country imposition sanctiontype sanctions_period
      (chr)      (dbl)        (chr)            (chr)
1 Afghanistan       1     1 6 8           1997-2001
2 Afghanistan       1     7               1979-1979
3 Afghanistan       1     4 7             1995-2002
4 Albania           1     2 8             2005-2005
5 Albania           1     7               2005-2006
6 Albania           1     8               2004-2005

我想合并这两个数据集,以便在每个GNI年度,我或者在国内都有制裁。对于不属于制裁周期的GNI年份,该值将为0,对于那些将为1的GNI年份。这就是我希望它看起来像:

         Country  Year GNIpc Imposition sanctiontype
           (chr) (dbl) (dbl)   (dbl)        (chr)
1    Afghanistan  1990    NA    0            NA
2    Afghanistan  1991    NA    0            NA
3    Afghanistan  1992  2010    0            NA
4    Afghanistan  1993    NA    0            NA
5    Afghanistan  1994 12550    0            NA
6    Afghanistan  1995    NA    1           4 7 

2 个答案:

答案 0 :(得分:1)

一些示例数据:

df1 <- data.frame(country = c('Afghanistan', 'Turkey'), 
                  imposition = c(1, 0), 
                  sanctiontype = c('1 6 8', '4'), 
                  sanctions_period = c('1997-2001', '2003-ongoing')
)

      country imposition sanctiontype sanctions_period
1 Afghanistan          1        1 6 8        1997-2001
2      Turkey          0            4     2012-ongoing

可以使用 dplyr tidyr 转换“penal_period”列:

library(tidyr)
library(dplyr)

df.new <- separate(df1, sanctions_period, c('start', 'end'), remove = F) %>% 
  mutate(end = ifelse(end == 'ongoing', '2016', end)) %>% 
  mutate(start = as.numeric(start), end = as.numeric(end)) %>% 
  group_by(country, sanctions_period) %>% 
  do(data.frame(country = .$country, imposition = .$imposition, sanctiontype = .$sanctiontype, year = .$start:.$end))

   sanctions_period     country imposition sanctiontype  year
             <fctr>      <fctr>      <dbl>       <fctr> <int>
1         1997-2001 Afghanistan          1        1 6 8  1997
2         1997-2001 Afghanistan          1        1 6 8  1998
3         1997-2001 Afghanistan          1        1 6 8  1999
4         1997-2001 Afghanistan          1        1 6 8  2000
5         1997-2001 Afghanistan          1        1 6 8  2001
6      2012-ongoing      Turkey          0            4  2012
7      2012-ongoing      Turkey          0            4  2013
8      2012-ongoing      Turkey          0            4  2014
9      2012-ongoing      Turkey          0            4  2015
10     2012-ongoing      Turkey          0            4  2016

从那里开始,它很容易与你的第一个数据框合并。请注意,您的第一个数据框大写国家和年份,而第二个数据框不大写。

df.merged <- merge(df.first, df.new, by.x = c('Country', 'Year'), by.y = c('country', 'year'))

答案 1 :(得分:0)

使用dplyr

left_join(GNIPC, sanctions, by=c("Country"="country", "Year"="Year")) %>%
  select(Country,Year, GNIpc, Imposition, sanctiontype)