首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于两个数据集中1列以上的合并数据集

基于两个数据集中1列以上的合并数据集
EN

Stack Overflow用户
提问于 2016-08-17 19:19:03
回答 2查看 90关注 0票数 0

我正在按年份和国家合并两个数据集。第一组数据(df = GNIPC)代表1980-2008年每个国家的人均国民总收入。

代码语言:javascript
复制
         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年至今实施的经济制裁。

代码语言:javascript
复制
      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

我要合并这两个数据集,以便在每一个国民总收入年中,我要么在该国实施制裁,要么没有制裁。对于不在sanctions_period中的GNI年份,其值为0,对于那些年份为1。

代码语言:javascript
复制
         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 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-17 20:35:19

一些示例数据:

代码语言:javascript
复制
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转换"sanctions_period“列。

代码语言:javascript
复制
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

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

代码语言:javascript
复制
df.merged <- merge(df.first, df.new, by.x = c('Country', 'Year'), by.y = c('country', 'year'))
票数 1
EN

Stack Overflow用户

发布于 2016-08-17 19:41:17

使用dplyr

代码语言:javascript
复制
left_join(GNIPC, sanctions, by=c("Country"="country", "Year"="Year")) %>%
  select(Country,Year, GNIpc, Imposition, sanctiontype)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39004626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档