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