मुझे पता है कि उत्तर पूरी तरह से आसान है लेकिन मैं इसे अब तक नहीं समझ सका। साथ ही मैंने ऐसे ही प्रश्नों के माध्यम से उत्तर खोजने की कोशिश की लेकिन मैं नहीं कर सका। वैसे भी, मुझे मैट्रिक्स m
के ID
को वापस करने की आवश्यकता है जिसमें वेक्टर (NoN
) के सभी तत्व हैं। उदाहरण में मैंने नीचे तैयार किया है, मुझे आईडी 1 और 3 वापस करने की आवश्यकता है।
उदाहरण:
m<-matrix(c(1,1,1,1,2,2,34,45,4,4,4,4,4,5,6,3,3,3,3,21,22,3425,345,65,22,42,65,86,456,454,5678,5,234,22,65,21,22,786),nrow=19)
colnames(m)<-c("ID","LO")
NoN<-c(21,22)
मेरे अब तक के प्रयास इस प्रकार हैं:
1: m[all(m[,2] %in% NoN),1]
2: m[match(NoN, m[,2]),1]
3: subset(m, m[,2] %in% NoN)
4: m[which(m[,2] %in% NoN),1]
सराहना!
4 जवाब
मैंने यह उत्तर @docendo डिस्किमस से लिया, जो मुझे यह कुशल और संक्षिप्त लगा।
df <- as.data.frame(m);
unique(df[as.logical(ave(df$LO, df$ID, FUN = function(x) all(NoN %in% x))),"ID"])
यहाँ आधार R
का उपयोग करके एक फ़ंक्शन दिया गया है:
FOO <- function(m, NoN){
# split matrix based on ID column
m2 <- lapply(split(m, m[, 1]), function(x) matrix(x, ncol = 2))
# match every element of NoN, create logical matrix
matchresult <- do.call(cbind, lapply(lapply(m2, function(x) lapply(NoN, function(y) match(y, x[,2]))), unlist))
# print colnames (= ID) of columns with no NA
as.numeric(colnames(matchresult)[colSums(apply(matchresult, 2, is.na)) == 0])
}
फ़ंक्शन कॉल का परिणाम:
> FOO(m, NoN)
[1] 1 3
आपके उदाहरण को छोड़कर परीक्षण नहीं किया गया है, लेकिन यह NoN
की किसी भी लंबाई के साथ-साथ ID
और LO
के डुप्लीकेट संयोजनों को संभालने में सक्षम होना चाहिए।
संपादित करें: @docendodiscimus द्वारा प्रदान किया गया अधिक संक्षिप्त और कुशल संस्करण:
FOO <- function(m, NoN){
df <- as.data.frame(m)
unique(df[as.logical(ave(df$LO, df$ID, FUN = function(x) all(NoN %in% x))),"ID"])
}
आधार R का उपयोग करने का इतना सुरक्षित तरीका नहीं है:
m<-matrix(c(1,1,1,1,2,2,34,45,4,4,4,4,4,5,6,3,3,3,3,21,22,3425,345,65,22,42,65,86,456,454,5678,5,234,22,65,21,22,786),nrow=19)
colnames(m)<-c("ID","LO")
NoN<-c(21,22)
IDs <- m[m[, 2] %in% NoN, 1]
IDs <- table(IDs)
IDs <- names(IDs)[IDs >= length(NoN)]
> IDs
[1] "1" "3"
लेकिन सावधान रहें, यह डुप्लिकेट किए गए मानों को ध्यान में नहीं रखता है। तो अगर आईडी 1 में 21 के दो एलओ होंगे लेकिन 22 नहीं, तो यह अभी भी आईडी 1 लौटाएगा।
संपादित करें: dplyr का उपयोग करने का एक सुरक्षित तरीका:
library(dplyr)
m <- data.frame(m)
IDs <- m %>%
slice(which(LO %in% NoN)) %>% # get all rows which contain values from NoN
group_by(ID) %>% # group by ID
summarise(uniques = n_distinct(LO)) %>% # count unique values per ID
filter(uniques == length(NoN)) %>% # number of unique values has to be the same as the number of values in NoN
select(ID) %>% # select ID columns
unlist() %>% # unlist it
as.numeric() # convert from named num to numeric
> IDs
[1] 1 3
यहां एक वैकल्पिक समाधान दिया गया है जो मैट्रिक्स m
को डेटाफ़्रेम के रूप में सहेजता है और प्रत्येक ID
के लिए एक प्रक्रिया करता है:
# example data
m<-matrix(c(1,1,1,1,2,2,34,45,4,4,4,4,4,5,6,3,3,3,3,21,22,3425,345,65,22,42,65,86,456,454,5678,5,234,22,65,21,22,786),nrow=19)
colnames(m)<-c("ID","LO")
NoN<-c(21,22)
library(dplyr)
data.frame(m) %>% # save m as dataframe
group_by(ID) %>% # for each ID
summarise(sum_flag = sum(LO %in% NoN)) %>% # count number of LO elements in NoN
filter(sum_flag == length(NoN)) %>% # keep rows where this number matches the length of NoN
pull(ID) # get the corresponding IDs
# [1] 1 3
ध्यान रखें कि यह प्रक्रिया मानती है (आपके उदाहरण के आधार पर) कि NoN
के तत्व और m
की पंक्तियाँ अद्वितीय हैं।