0

我有两张桌子;“参考”和“表A”。

我正在查看 TableA 这是一个不完整的表,并希望通过引用“参考”表、填充缺失值和/或添加找到多个匹配项的行来将其变成一个“完整”表。

“Reference”和“TableA”的可重现示例如下:

A <- c(1,1,1,2,4,4,5,5,7,6,2,1)
B <- c(1,2,2,2,4,4,9,5,8,6,2,9)
C <- c(1,1,3,3,4,5,5,5,7,6,3,3)
D <- c(1,2,1,1,2,1,2,1,2,2,2,1)

Reference <- data.frame(A,B,C,D)

A <- c(NA,1,5,2,4,1)
B <- c(NA,2,NA,2,NA,1)
C <- c(3,NA,5,NA,NA,1)
D <- c(1,1,2,2,1,1)

TableA <- data.frame(A,B,C,D)

我试图通过执行以下操作来解决此问题:

for (i in 1:dim(TableA)[1])
{
  tmp<-TableA[i,]
  repet<-ifelse(is.na(TableA$D[i]), Reference, 1 )
  for (j in 1:repet) {
    tmp$D<-ifelse(repet>1, Reference$D[j,], tmp$D)
    collector<-rbind(collector, tmp)
    }
}
collector

但是,此解决方案将返回整个 Reference$D,但我只想从 Reference$D 返回那些 A、B、C 列与 TableA 上的内容匹配(或部分匹配)的记录。

例如,在 TableA 的第 1 行中,我想将第 1 行替换为参考表的第 3、4 和 12 行。

预期输出如下。

请注意,参考表组合 1、2、3、1 在预期输出中出现两次,因为它与 TableA 的第 1 行和第 2 行都匹配。

一个 C D
1 2 3 1
2 2 3 1
1 9 3 1
1 2 3 1
5 9 5 2
2 2 3 2
4 4 5 1
1 1 1 1
4

1 回答 1

0

我将首先在 和 中创建一个额外的列“字符串”,TableAReferenceNA中的点替换.TableA这将用于正则表达式匹配。

然后找出出现在 中的string哪个,并将它们存储在一个矩阵中。TableAReference

lgl_matrix最后,按匹配数复制行号,并将这些行号用作Reference.

library(tidyverse)

TableA <- TableA %>% 
  mutate(across(A:D, ~ replace_na(as.character(.x), "."))) %>% 
  rowwise() %>% 
  mutate(string = paste0(c_across(A:D), collapse = ""))

Reference <- Reference %>% 
  rowwise() %>% 
  mutate(string = paste0(c_across(A:D), collapse = ""))

lgl_matrix <- sapply(TableA$string, grepl, x = Reference$string)

Reference[rep(1:nrow(lgl_matrix), rowSums(lgl_matrix)), -5]

# A tibble: 8 x 4
# Rowwise: 
      A     B     C     D
  <dbl> <dbl> <dbl> <dbl>
1     1     1     1     1
2     1     2     3     1
3     1     2     3     1
4     2     2     3     1
5     4     4     5     1
6     5     9     5     2
7     2     2     3     2
8     1     9     3     1
于 2022-02-18T07:50:45.460 回答