j'ai une trame de données comme les suivantesFonction avec une boucle pour créer une colonne avec les valeurs 1: n conditionné par intervalles appariés par une autre colonne
my_df=data.frame(x=runif(100, min = 0,max = 60),
y=runif(100, min = 0,max = 60)) #x and y in cm
Avec cela, je besoin d'une nouvelle colonne avec des valeurs de 1 à 36 qui correspondent x
et y
tous les 10 cm. Par exemple, si 0<=x<=10 & 0<=y<=10
, mettre 1, puis si 10<=x<=20 & 0<=y<=10
, mettre 2 et ainsi de suite jusqu'à 6, puis 0<=x<=10 & 10<=y<=20
en commençant par 7 jusqu'à 12, etc. J'ai essayé de faire une fonction avec un if
répéter l'intervalle de x
6 fois, et en augmentant de 10 l'intervalle pour y
à chaque itération. Voici la fonction
#my miscarried function 'zones'
>zones= function(x,y) {
i=vector(length = 6)
n=vector(length = 6)
z=vector(length = 36)
i[1]=0
z[1]=0
n[1]=1
for (t in 1:6) {
if (0<=x & x<10 & i[t]<=y & y<i[t]+10) { z[t] = n[t]} else
if (10<=x & x<20 & i[t]<=y & y<i[t]+10) {z[t]=n[t]+1} else
if (20<=x & x<30 & i[t]<=y & y<i[t]+10) {z[t]=n[t]+2} else
if (30<=x & x<40 & i[t]<=y & y<i[t]+10) {z[t]=n[t]+3} else
if (40<=x & x<50 & i[t]<=y & y<i[t]+10) {z[t]=n[t]+4}else
if (50<=x & x<=60 & i[t]<=y & y<i[t]+10) {z[t]=n[t]+5}
else {i[t+1]=i[t]+10
n[t+1]=n[t]+6}
}
return(z)
}
>xy$z=zones(x=xy$x,y=xy$y)
et je me suis
There were 31 warnings (use warnings() to see them)
>xy$z
[1] 0 0 0 0 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
S'il vous plaît, aidez-moi avant de mourir seul!
Maintenant que vous n'auriez pas à mourir seul, vous devriez accepter l'une des réponses. :) – Suren
@Headpoint Désolé! Je mourais dans un pub, mais j'ai vu la lumière. Merci, la solution que vous avez fournie fonctionne très bien. – jealcalat