1
votes

Accéder au numéro de ligne dans lapply

Je voudrais accéder au numéro de ligne actuel dans une itération lapply:

x[1] - y[2]     Luke Skywalker & C-3PO
x[1] - y[3]     Luke Skywalker & R2-D2
x[1] - y[4]     Luke Skywalker & Darth Vader

x[2] - y[3]     C-3PO & R2-D2
x[2] - y[4]     C-3PO & Darth Vader

x[3] - y[4]     R2-D2 & Darth Vader

Dans la deuxième instruction lapply, j'ai besoin d'accéder à l'entrée suivante de la première actuelle, donc à la place de cette sortie

x[1] - y[2]     Luke Skywalker & C-3PO
x[1] - y[3]     Luke Skywalker & R2-D2
x[1] - y[4]     Luke Skywalker & Darth Vader

x[2] - y[2]     C-3PO & C-3PO
x[2] - y[3]     C-3PO & R2-D2
x[2] - y[4]     C-3PO & Darth Vader

x[3] - y[2]     R2-D2 & C-3PO
x[3] - y[3]     R2-D2 & R2-D2
x[3] - y[4]     R2-D2 & Darth Vader

Je voudrais avoir cette sortie pour éviter d'obtenir la même ligne deux fois

lapply(dplyr::starwars$name[1:3], function(x){
  lapply(dplyr::starwars$name[2:4], function(y){
    paste(x,'&',y)
  })
})

Est-ce possible pour récupérer le numéro de la ligne actuelle (premier lapply) et le mettre dans le second lapply?


0 commentaires

3 Réponses :


1
votes

Que diriez-vous d'une approche différente:

combn(starwars$name[1:4], 2, paste, collapse = " & ")

[1] "Luke Skywalker & C-3PO"       "Luke Skywalker & R2-D2"       "Luke Skywalker & Darth Vader" "C-3PO & R2-D2"                "C-3PO & Darth Vader"         
[6] "R2-D2 & Darth Vader"     


1 commentaires

Merci mais je dois le faire avec lapply, je veux en fait comparer d'énormes ensembles de données avec parLapply



1
votes

Une façon de le faire est d'utiliser lapply sur les index, mais se référer aux données à l'intérieur de la fonction

lapply(1:3, function(x){
    lapply((x+1):4, function(y){
        paste(dplyr::starwars$name[x],'&',dplyr::starwars$name[y])
    })
})


1 commentaires

Merci beaucoup, cela devrait gagner beaucoup de temps à calculer :)



0
votes
result<-lapply(dplyr::starwars$name[1:3], function(x){
  lapply(dplyr::starwars$name[2:4], function(y){
if(x!=y) paste(x,'&',y) else NULL
  })
})
unlist(result)

1 commentaires

Merci, mais c'est 7 résultats au lieu de 6 ("C-3PO & R2-D2" & "R2-D2 & C-3PO") et cela ne semble pas être aussi efficace à cause des entrées NULL