我有两个矩阵,一个是index
矩阵(ncol = 1,nrow = 20,000),存储我想要搜索的值,另一个矩阵是data
矩阵,存储大数据集(ncol = 1,nrow = 5,000)。
index
矩阵:(water
,meat
,gas
....是行名称)
water DFAFADFADF
meat QEREQRQTQTQ
gas FEQQFQEFQF
.
.
.
..
data
矩阵:( Tom
,Luis
,Jerry
,Vincent
,Richard
...是行名称
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
,但不知道如何。
答案 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"))
}), ]