将数据框的行与“主”行进行比较

时间:2019-03-12 19:35:56

标签: r

今天,在解决某个人的问题的答案时,我意识到我一直依靠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循环的情况下,该怎么做?。我意识到comparesqldf之类的软件包可以轻松实现此目的,但是我想知道是否有人可以在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

Return row of Data Frame based on value in a column - R

0 个答案:

没有答案