Próbuję utworzyć zmienną identyfikację, która identyfikuje grupy liczb z tym samym identyfikatorem. To wszystko, co jest w jednym rzędzie w Idmat powinien być jednym identyfikatorem. Jeśli Prod4 jest jedną z tych liczb, to identyfikator powinien być kolejnością wiersza w Idmat.

Moim problemem jest to, że stajemy zer dla ID. Co ja robię źle?

idmat<-matrix(c(1140,   1139,   1138,
             1146,  1145,   1144,
             1152,  1152,   1150,
             1159,  1158,   1157,
             1165,  1164,   1163), nrow=5,ncol=3,byrow=TRUE)

prod4 <- c(1129, 1140, 1158, 1157)

# connect pairs:

pr4<- data.frame(prod4=prod4)
for (i in 1:5){
pr4<- within(pr4, { id <- ifelse(prod4 %in% idmat[i,], i, NA)})
}

Oczekiwany wynik: Wpisz opis obrazu tutaj

1
Stata_user 27 marzec 2020, 00:42

2 odpowiedzi

Najlepsza odpowiedź

Możemy użyć sapply, aby pętli po wartościach "Prod4", sprawdzić, czy jest równy "idmat", zdobądź indeksy rzędowe / kolumnowe za pomocą which za pomocą arr.ind = TRUE, a następnie wyodrębnij Kolumna indeksu wiersza ([,1]) i utwórz data.frame

id <- unname(sapply(prod4, function(x) which(x == idmat, arr.ind = TRUE)[,1][1]))
data.frame(prod4, id)
#  prod4 id
#1  1129 NA
#2  1140  1
#3  1158  4
#4  1157  4

Lub za pomocą pętli for

pr4$id <- NA_integer_
for(i in seq_len(nrow(pr4))) {
 pr4$id[i] <- which(pr4$prod4[i] == idmat, arr.ind = TRUE)[,1][1]
}
2
akrun 26 marzec 2020, 22:22

Inną bazową opcją R jest zdefiniowanie swojej niestandardowej funkcji f, ale z tym samym rdzeniem, co @akrun, tj. which

f <- Vectorize(function(x) which(x==idmat,arr.ind = TRUE)[1])
df <- data.frame(prod4,id = f(prod4))

Takie że

> df
  prod4 id
1  1129 NA
2  1140  1
3  1158  4
4  1157  4
1
ThomasIsCoding 26 marzec 2020, 22:52