今天,在解决某个人的问题的答案时,我意识到我一直依靠for循环了一段时间,考虑到R以其可以很好地使用矢量化函数而著称,这往往是一种罪过。
说我们有一个数据框,其中保存有我们的“条件”,这些条件是我们要用于与数据比较的数据行。如果我们的“主”行之一与数据框的一行完全匹配,则我们要打印“匹配”。
# Data to be checked
DF<-data.frame(A=c(1,4,5,6),B=c(1,5,4,2),C=c(5,6,3,2),D=c(1,2,3,4),
E=c(4,2,3,4))
# Our condition/master data
Compare<-data.frame(A=4,B=5,C=6,D=2,E=2)
通过使用for循环,这是一项容易的任务,但是一旦我们创建了越来越大的数据集,就会很麻烦:
#This Works, but ew
for(i in 1:length(DF)){
ifelse(DF[i,]==Compare, print("match"),print("no match"))
}
[1] "no match"
[1] "match"
[1] "no match"
[1] "no match"
我的问题是,在不使用基R中的for循环的情况下,该怎么做?。我意识到compare
和sqldf
之类的软件包可以轻松实现此目的,但是我想知道是否有人可以在R的基础上做到这一点。很清楚。
编辑:
由于@弗兰克在评论中
如果所有数据都是数字,则rowSums(DF == Compare[rep(1, nrow(DF)), ]) == ncol(DF)
效果很好。让事情复杂化,说在我们的主列表中,还有字符串数据也要匹配
# Sample Data
DF<-data.frame(
A=c("N","J","K","L"),
B=c(1,3,4,2),
C=c(5,4,3,2),
D=c(1,5,3,4),
E=c(4,2,3,4),stringsAsFactors=F)
Compare<-data.frame(A="J",B=3,C=4,D=5,E=2)
#This Works
for(i in 1:length(DF)){
ifelse(DF[i,]==Compare, print("match"),print("no match"))
}
研究:
我看到我们可以使用'merge'进行比较,但这不能让我知道我的比赛在原始数据中的位置,我只会看到返回的比赛:
Fetch all the rows in a data frame matching with rows of other data frame
下面的东西可以做到,但是无法扩展。
which(DF$A == Compare$A & DF$B==Compare$B & DF$C == Compare$C) #etc.
[1] 2