首页 > 解决方案 > 与两列 R 匹配的相邻列

问题描述

我有一个看起来像这样的数据框:

V1   V2   V3    V4   V5
A    C    B     D    NA
B    D    NA    NA   NA
D    B    A     E    NA 
D    A    C     E    B 

和另一个具有成对列的数据框,例如:

Col1    Col2
  A      B
  B      D 
  C      E 
  B      A
  E      B

我想使用包含 Col1 和 Col2 的配对数据帧,在第一个数据帧中找到这些连续对以及它的位置。

所以它会导致类似于:

[1]  3  4
[2]  1  2 
[3]  2  3 
[4]  3  4  5

我尝试使用 for 循环,但效率极低且容易出错。我真的很感激一些建议,也许是应用功能。

标签: rapply

解决方案


有几个解决方案,没有一个是完美的。下面,df1是第一个数据帧,df2是第二个数据帧。

以下解决方案基于以下事实:值是常规的 -​​ 始终具有相同的格式,并且它们不包含“--”。

df1B <- sapply(1:(ncol(df1) - 1), function(i) paste0(df1[,i], "--", df1[,i+1]))
pat <- paste0(df2[,1], "--", df2[,2])
apply(df1B, 1, function(r) which(r %in% pat))

这将返回一个列表,其中每一行都有一个元素。鉴于您的第二个数字始终是第一个数字加一,因此解决方案等同于您的预期结果:

[[1]]
[1] 3

[[2]]
[1] 1

[[3]]
[1] 2

[[4]]
[1] 3 4

请注意,这不是一般的解决方案,因为如果 df2 的一个单元格包含“A--B”,那么搜索模式将是例如“A--B--C”并且将匹配两者(“A--B ", "C") 和 ("A", "B--C")。

将结果列表转换为数据框格式是可能的,但很乏味。

res <- apply(df1B, 1, function(r) which(r %in% pat))
max <- max(sapply(res, length))

df <- lapply(1:max, function(i) sapply(res, function(r) c(r[i], r[i] +1)))
df <- Reduce(cbind, lapply(df, t))

结果

> df
     [,1] [,2] [,3] [,4]
[1,]    3    4   NA   NA
[2,]    1    2   NA   NA
[3,]    2    3   NA   NA
[4,]    3    4    4    5

推荐阅读