【问题标题】:merge two dataset based on one column and one row基于一列一行合并两个数据集
【发布时间】:2022-01-25 11:08:39
【问题描述】:

我有两个数据集,我想根据国家和日期合并它们,但问题是data2中的日期是一行!我怎样才能合并它们?你有什么想法吗?

# Create first data frame
data1 <- data.frame(ID1 = 1:5,                                 
                    country = letters[1:5],
                    date = c(2011, 2013, 2013, 2014, 2015),
                    x2 = 9)

# Create second data frame
data2 <- data.frame(ID1 = 3:7,                                 
                    country = letters[3:7],
                    2011 = c(4, 4, 5, 1, 1),
                    2012 = 5)

【问题讨论】:

  • 您要合并还是追加它们?正如我所见,两个数据集之间没有国家和日期重叠。还是要追加这两个数据集?

标签: r dataframe merge


【解决方案1】:

使用reshapemerge

data2 |> 
  reshape(idvar=c('ID1', 'country'), varying=3:4, v.names='x2', times=c(2011, 2012),
          timevar='date', direction='long') |>
  merge(data1, all=TRUE)
#    ID1 country date x2
# 1    1       a 2011  9
# 2    2       b 2013  9
# 3    3       c 2011  4
# 4    3       c 2012  5
# 5    3       c 2013  9
# 6    4       d 2011  4
# 7    4       d 2012  5
# 8    4       d 2014  9
# 9    5       e 2011  5
# 10   5       e 2012  5
# 11   5       e 2015  9
# 12   6       f 2011  1
# 13   6       f 2012  5
# 14   7       g 2011  1
# 15   7       g 2012  5

注意:R version 4.1.2 (2021-11-01)


data1 <- structure(list(ID1 = 1:5, country = c("a", "b", "c", "d", "e"
), date = c(2011, 2013, 2013, 2014, 2015), x2 = c(9, 9, 9, 9, 
9)), class = "data.frame", row.names = c(NA, -5L))

data2 <- structure(list(ID1 = 3:7, country = c("c", "d", "e", "f", "g"
), X2011 = c(4, 4, 5, 1, 1), X2012 = c(5, 5, 5, 5, 5)), class = "data.frame", row.names = c(NA, 
-5L))

【讨论】:

  • 变化的作用是什么?
  • @MarziehKarimi 这是我们在data2 中定义具有时变分量的变量的地方,您也可以说varying=c('X2011', 'X2012'),即按名称定义。
【解决方案2】:

我们可以在旋转data2 之后使用full_join

library(dplyr)
library(tidyr)

data2 %>% 
  pivot_longer(
    cols = -c(ID1, country),
    names_to = "date",
    values_to = "value",
    names_transform = list(date = as.double)
  ) %>% 
  full_join(data1, by=c("ID1", "country", "date", "value"="x2"))
     ID1 country  date value
   <int> <chr>   <dbl> <dbl>
 1     3 c        2011     4
 2     3 c        2012     5
 3     4 d        2011     4
 4     4 d        2012     5
 5     5 e        2011     5
 6     5 e        2012     5
 7     6 f        2011     1
 8     6 f        2012     5
 9     7 g        2011     1
10     7 g        2012     5
11     1 a        2011     9
12     2 b        2013     9
13     3 c        2013     9
14     4 d        2014     9
15     5 e        2015     9

【讨论】:

  • 我想在 data2 中添加一个值为 2011 和 2012 列的列,我不想要 x2 ,我应该写什么?
猜你喜欢
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 2020-07-17
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 2018-01-30
相关资源
最近更新 更多