r - 与两列 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 循环,但效率极低且容易出错。我真的很感激一些建议,也许是应用功能。
解决方案
有几个解决方案,没有一个是完美的。下面,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
推荐阅读
- linux - 我无法克服的 yaml 烦人问题
- java - JFrame在打开时陷入了一些奇怪的内部死锁
- node.js - bash,nohup sh 文件启动节点并且节点在注销时挂起?
- javascript - 如何通过 textarea 的大小限制 textarea 中的字符?
- scala - 将 Akka Http 服务的一些路径参数更改为查询参数
- spring - 重定向在生产一段时间后停止工作
- javascript - 在另一个对象的构造函数中创建一个新的 ES6 对象失败
- c++ - C++ 环境变量
- unix - 如何将两个 Vim 命令合二为一(命令不是键绑定)
- c# - 如果下一个值在 epPlus 中是否相同,如何检查和合并两行