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)})
}
2 odpowiedzi
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]
}
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
Podobne pytania
Nowe pytania
r
R to darmowy język programowania typu open source i środowisko oprogramowania do obliczeń statystycznych, bioinformatyki, wizualizacji i obliczeń ogólnych. Proszę podać minimalne i powtarzalne przykłady wraz z pożądanymi wynikami. Użyj dput () dla danych i określ wszystkie pakiety inne niż podstawowe za pomocą wywołań biblioteki (). Nie osadzaj obrazów dla danych lub kodu, zamiast tego użyj wciętych bloków kodu. W przypadku pytań związanych ze statystykami należy skorzystać z https://stats.stackexchange.com.