测试列表中是否存在模式;如果是,则替换另一个列表中的元素

时间:2016-12-16 12:18:13

标签: r list find-replace

在R中,我想测试列表中是否存在模式,以替换位于另一个列表中位置的元素。

让我举个例子。我的第一个列表如下所示:

表1:

[1] [2]
[1,] ABBA 丰原
[2,] ABBU CCCH

我的第二个清单如下:

[1] [2]
[1,] KIGS PLOM
[2,] ANAM AKAM

我想测试条件,如果我的第二个列表中存在模式“KI”,则替换我第一个列表中相同位置的元素。

在这种情况下,KI出现在我的第二个“KIGS”列表中,我将用“KI”替换“ABBA”。因此在两个列表中的位置[1,1]。

有没有办法在兰德轻松做到这一点获得以下列表:

[1] [2]
[1,] KI 丰原
[2,] ABBU CCCH

1 个答案:

答案 0 :(得分:0)

如果我理解您的答案,可能的解决方案是使用与ifelse相关的命令grepl。但是,你有两个矩阵或两个列表吗? 列表是包含其他对象的通用向量,它与您的示例不同(请阅读此站点http://www.programcreek.com/2014/01/vector-array-list-and-data-frame-in-r/)。 然后:

以两个矩阵为例:

   table1<-matrix(c("ABBA","BBCA","ABBU","CCCH"),nrow=2,ncol=2,byrow=TRUE)
   table2<-matrix(c("KIGS","BBCA","ABBU","CCCH"),nrow=2,ncol=2,byrow=TRUE)

table1
     [,1]   [,2]  
[1,] "ABBA" "BBCA"
[2,] "ABBU" "CCCH"

table2
     [,1]   [,2]  
[1,] "KIGS" "BBCA"
[2,] "ABBU" "CCCH"

我使用for循环ifelse,条件元素选择和grepl命令:

for(j in 1:ncol(table2)){
for(i in 1:nrow(table2)) { 
table2[i,j]<-ifelse(grepl("KI",table2[i,j])==TRUE,table1[i,j],table2[i,j])
}}

然后我们将table2作为:

table2
     [,1]   [,2]  
[1,] "ABBA" "BBCA"
[2,] "ABBU" "CCCH"