R 中的匹配列

Matching columns in R

我有几年的数据和唯一的参考代码,我想做的是跟踪参考代码如何随着时间的推移出现在数据中,有人有办法做到这一点吗?我将举例说明我正在寻找的东西。
这可能是数据的样子:

2005 2006 2007
92837503 75482342 54654656
34923478 13049483 98769879
..... ..... .....
09340823 2304923 0988775

我要做的是匹配多年来的唯一参考文献,并在可能不会出现的地方留有空白:

2005 2006 2007
92837503 92837503 92837503
34923478 na 34923478
..... ..... .....
09340823 na na
na 2304923 na

这可能不是 easiest/quickest 的方式,但我的方法是 pivot/unpivot

library(tidyverse)

data %>%
  pivot_longer(cols = colnames(data), #this assumes that only your years are the columns in the data.
               names_to = "year",
               values_to = "code") %>%
  mutate(id_code = code) %>% #This will line up the codes on the same row in the next step.
  pivot_wider(id_cols = "id_code",
              names_from = "year",
              values_from = "code",
              values_fill = NULL #This will ensure that all the missing values are the same, change if appropriate.
              ) %>%
  select(-id_code) #drop the id column if no longer required.

我认为这比使用连接更容易,但可能有更好的方法,有人可能会提出 rowwise() 解决方案。

代码

library(data.table)

Reduce(f = function(x, y) merge(x, y, by = c("i"), all = T), lapply(list(df1, df2, df3), function(x) setDT(x)[, i := x[, 1L]]))

示例数据

df1 <- data.frame(`2005` = c(1,3,6,7,12))
df2 <- data.frame(`2006` = c(12,2,4,7,10))
df3 <- data.frame(`2007` = c(4,100))

结果

#      i X2005 X2006 X2007
# 1:   1     1    NA    NA
# 2:   2    NA     2    NA
# 3:   3     3    NA    NA
# 4:   4    NA     4     4
# 5:   6     6    NA    NA
# 6:   7     7     7    NA
# 7:  10    NA    10    NA
# 8:  12    12    12    NA
# 9: 100    NA    NA   100

详细解释

在这里,一个衬里分解成三行(步骤)

您提到您 data.frames 单独存储,因此我们将它们添加到列表中。

dfs <- list(df1, df2, df3)

然后我们应用列表中的每个 table 并创建一个通用列,我们稍后可以合并,该列将称为“i”。 setDT 使 data.frame 成为 data.table 并且 i := x[x, 1L] 确保 i 值将成为您的值。

dfs <- lapply(dfs, function(x) setDT(x)[, i := x[, 1L]])

然后我们可以使用基础Reduce函数来合并通用列i上的table列表。 Reduce 函数有两个值,x 是之前(合并)的结果,y 是新值(下一个 table 合并)。

Reduce(f = function(x, y) merge(x, y, by = c("i"), all = T), dfs)