मुझे पता है कि उत्तर पूरी तरह से आसान है लेकिन मैं इसे अब तक नहीं समझ सका। साथ ही मैंने ऐसे ही प्रश्नों के माध्यम से उत्तर खोजने की कोशिश की लेकिन मैं नहीं कर सका। वैसे भी, मुझे मैट्रिक्स 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]

सराहना!

r
2
Ester Silva 20 पद 2017, 15:49

4 जवाब

सबसे बढ़िया उत्तर

मैंने यह उत्तर @docendo डिस्किमस से लिया, जो मुझे यह कुशल और संक्षिप्त लगा।

df <- as.data.frame(m); 
unique(df[as.logical(ave(df$LO, df$ID, FUN = function(x) all(NoN %in% x))),"ID"])
0
Ester Silva 22 पद 2017, 17:07

यहाँ आधार 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"])
}
3
LAP 20 पद 2017, 17:20

आधार 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
2
brettljausn 20 पद 2017, 16:53

यहां एक वैकल्पिक समाधान दिया गया है जो मैट्रिक्स 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 की पंक्तियाँ अद्वितीय हैं।

0
AntoniosK 20 पद 2017, 16:25