Сегодня, разрабатывая ответ на чей-то вопрос, я понял, что какое-то время держался за циклы, что является грехом, учитывая, что R известен тем, насколько хорошо он может использовать векторизованные функции.
Скажем, у нас есть фрейм данных, в котором мы храним наши «условия», это строки данных, которые мы хотим использовать для сравнения с нашими данными.Если одна из наших «главных» строк полностью совпадает со строкой фрейма данных, мы хотим напечатать «match».
# 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"
Мой вопрос: как бы кто-то сделал это без использования цикла for в базе R .Я понимаю, что такие пакеты, как compare
и sqldf
могут сделать это легко, но мне интересно, может ли кто-нибудь сделать это на базе R. Я думаю, что это очевидно, но я не могу понять это.
РЕДАКТИРОВАТЬ: Как @Frank ответил в комментариях 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"))
}
Исследование:
Я вижучто мы можем использовать «слияние» для сравнения, но это не позволит мне узнать, где мои совпадения были в исходных данных, я только увижу возвращенные совпадения:
Извлечь все строки всопоставление фрейма данных со строками другого фрейма данных
Что-то, что ниже, делает это, но невозможно масштабировать.
which(DF$A == Compare$A & DF$B==Compare$B & DF$C == Compare$C) #etc.
[1] 2
Возвращать строку фрейма данных на основе значенияв колонке - R