如何在矩阵中搜索多个值并返回其行名?

时间:2016-06-19 02:38:08

标签: r matrix

我有两个矩阵,一个是index矩阵(ncol = 1,nrow = 20,000),存储我想要搜索的值,另一个矩阵是data矩阵,存储大数据集(ncol = 1,nrow = 5,000)。

index矩阵:(watermeatgas ....是行名称)

water    DFAFADFADF
meat     QEREQRQTQTQ
gas      FEQQFQEFQF
.
.
.
..

data矩阵:( TomLuisJerryVincentRichard ...是行名称

Tom              dfqfqfAFADFADaveffefd
Luis             eqeqfqefAFADFADuouojoimoij
Jerry            dafadfe3321AFADFADfdeff
Vincent          e31413413qeffffff
Richard          121eefq3ffAFADFADfffqffqff
.
.
.
..

我想找到index矩阵中的每个值,data矩阵的哪一行包含(S)该字符串,并记录其data矩阵' s行名称并将其放在index矩阵中该字符串行的以下列中(或在单个列中,但由","分隔)。

例如,我想要一个循环并首先从索引矩阵中取值"DFAFADFADF"并搜索数据矩阵中哪些行包含此字符串,所以我发现Tom,Luis,Jerry,Richard在{ {1}}矩阵包含该字符串,因此我将data矩阵更新为

index矩阵:

index

然后我在water DFAFADFADF Tom, Luis, Jerry, Richard meat QEREQRQTQTQ gas FEQQFQEFQF . . . .. 矩阵index中取下一个值,再次搜索QEREQRQTQTQ矩阵,然后再次更新data矩阵,直到我完成了index矩阵的最后一行。

任何人都可以帮助循环吗?我想我们可能需要一个循环,使用index,但不知道如何。

2 个答案:

答案 0 :(得分:0)

index <- data.frame(one = c("ABC", "DEF", "GHI", "JKL"))
rownames(index) <- c("water", "meat", "fruit", "bread")
data <- data.frame(one = c("ABCDEF", "DEFZMN", "MNOABC", "ZXCJKL"))
rownames(data) <- c("Tom", "Jerry", "Rob", "Nate")

results <- data.frame()
for (r in 1:nrow(index)) {
    index$results[r] <- list(rownames(data)[grep(index$one[r], data$one, ignore.case = T)])
    count <- length(unlist(index$results[r]))
    df <- data.frame(data_match = unlist(index$results[r]),
                     pattern = rep(index$one[r], times = count),
                     index_match = rep(rownames(index)[r], times = count))
    results <- rbind(results, df)
}
reshape2::dcast(results, index_match ~ data_match)

这将在列索引$ results中生成list(),因此您可能需要在其上调用unlist(),具体取决于您希望如何处理下游信息。同样在R中你可以有命名向量,在一个案例中你有一个列数据框,也许你可能只需要一个这样的命名字符向量:

index <- c("ABC", "DEF", "GHI", "JKL")
names(index) <- c("water", "meat", "fruit", "bread")

下次可能会使匹配更简单。

答案 1 :(得分:0)

更短的解决方案:

row.names(data)[apply(data, 1, function(x) {
  sapply(x, function(y) y %in% c("DFAFADFADF", "QEREQRQTQTQ", "FEQQFQEFQF"))
}), ]