2017-09-28 1 views
1

I ont une trame de données comme:Remplacer les valeurs des variables ID avec les chiffres de valeur occurrences

 DATE x  y ID 
06/10/2003 7.21 0.651 1 
12/10/2003 5.99 0.428 1 
18/10/2003 4.68 1.04 1 
24/10/2003 3.47 0.363 1 
30/10/2003 2.42 0.507 1 
02/05/2010 2.72 0.47 2 
05/05/2010 2.6 0. 646  2 
08/05/2010 2.67 0.205 2 
11/05/2010 3.57 0.524 2 
12/05/2010 0.428 4.68 3 
13/05/2010 1.04 3.47 3 
14/05/2010 0.363 2.42 3 
18/10/2003 0.507 2.52 3 
24/10/2003 0.418 4.68 3 
30/10/2003 0.47 3.47 3 
29/04/2010 0.646 2.42 4 
18/10/2003 3.47 2.52 4 

i ont le comptage du nombre de lignes par groupe pour l'ID de colonne en tant que vecteur d'entier comme 5 4 6 2

il est un moyen pour remplacer les valeurs de groupe dans l'ID de colonne avec ceux-ci vecteur entier 5 4 6 2

la sortie j'attends est

DATE x y ID 
06/10/2003 7.21 0.651 5 
12/10/2003 5.99 0.428 5 
18/10/2003 4.68 1.04 5 
24/10/2003 3.47 0.363 5 
30/10/2003 2.42 0.507 5 
02/05/2010 2.72 0.47 4 
05/05/2010 2.6  646 4 
08/05/2010 2.67 0.205 4 
11/05/2010 3.57 0.524 4 
12/05/2010 0.428 4.68 6 
13/05/2010 1.04 3.47 6 
14/05/2010 0.363 2.42 6 
18/10/2003 0.507 2.52 6 
24/10/2003 0.418 4.68 6 
30/10/2003 0.47 3.47 6 
29/04/2010 0.646 2.42 2 
18/10/2003 3.47 2.52 2 

Je suis assez nouveau à R et j'ai essayé de trouver s'il y a une fonction de remplacement d'idée. Mais avoir du mal. Toute aide est très appréciée.

ci-dessus est juste un exemple pour comprendre mes besoins.

Répondre

1

avec une solution dplyr:

library(dplyr) 
df %>% 
    group_by(ID) %>% 
    mutate(ID2 = n()) %>% 
    ungroup() %>% 
    mutate(ID = ID2) %>% 
    select(-ID2) 

Edit:

Je viens de trouver une solution qui est un peu plus propre que ce qui précède:

df %>% 
    group_by(ID2 = ID) %>% 
    mutate(ID = n()) %>% 
    select(-ID2) 

Résultat:

# A tibble: 17 x 4 
     DATE  x  y ID 
     <fctr> <dbl> <dbl> <int> 
1 06/10/2003 7.210 0.651  5 
2 12/10/2003 5.990 0.428  5 
3 18/10/2003 4.680 1.040  5 
4 24/10/2003 3.470 0.363  5 
5 30/10/2003 2.420 0.507  5 
6 02/05/2010 2.720 0.470  4 
7 05/05/2010 2.600 0.646  4 
8 08/05/2010 2.670 0.205  4 
9 11/05/2010 3.570 0.524  4 
10 12/05/2010 0.428 4.680  6 
11 13/05/2010 1.040 3.470  6 
12 14/05/2010 0.363 2.420  6 
13 18/10/2003 0.507 2.520  6 
14 24/10/2003 0.418 4.680  6 
15 30/10/2003 0.470 3.470  6 
16 29/04/2010 0.646 2.420  2 
17 18/10/2003 3.470 2.520  2 

Notes:

La raison ungroup() %>% mutate(ID = ID2) %>% select(-ID2) est que dplyr doesn n'autorise pas mutate sur le regroupement de variables. Donc, cela ne fonctionnerait pas:

df %>% 
    group_by(ID) %>% 
    mutate(ID = n()) 

Erreur dans mutate_impl (.données, points): la colonne ID ne peut pas être modifié car il est un groupement de variables

Si vous ne vous pouvez simplement ne se soucient pas de remplacer la colonne ID originale,:

df %>% 
    group_by(ID) %>% 
    mutate(ID2 = n()) 

Résultat alternatif:

# A tibble: 17 x 5 
# Groups: ID [4] 
     DATE  x  y ID ID2 
     <fctr> <dbl> <dbl> <int> <int> 
1 06/10/2003 7.210 0.651  1  5 
2 12/10/2003 5.990 0.428  1  5 
3 18/10/2003 4.680 1.040  1  5 
4 24/10/2003 3.470 0.363  1  5 
5 30/10/2003 2.420 0.507  1  5 
6 02/05/2010 2.720 0.470  2  4 
7 05/05/2010 2.600 0.646  2  4 
8 08/05/2010 2.670 0.205  2  4 
9 11/05/2010 3.570 0.524  2  4 
10 12/05/2010 0.428 4.680  3  6 
11 13/05/2010 1.040 3.470  3  6 
12 14/05/2010 0.363 2.420  3  6 
13 18/10/2003 0.507 2.520  3  6 
14 24/10/2003 0.418 4.680  3  6 
15 30/10/2003 0.470 3.470  3  6 
16 29/04/2010 0.646 2.420  4  2 
17 18/10/2003 3.470 2.520  4  2 
2

Vous pouvez utiliser la fonction ave() pour calculer le nombre de lignes que prend chaque ID. Dans l'exemple ci-dessous, j'ai créé une nouvelle variable ID2, mais vous pouvez remplacer l'ID d'origine si vous le souhaitez.

(J'ai inclus le code pour créer vos données dans R ci-dessous, mais lorsque vous posez des questions à l'avenir, veuillez inclure vos données dans la question en utilisant la fonction dput() sur l'objet de données. .)

mydata <- structure(list(DATE = c("06/10/2003", "12/10/2003", "18/10/2003", 
         "24/10/2003", "30/10/2003", "02/05/2010", "05/05/2010", "08/05/2010", 
         "11/05/2010", "12/05/2010", "13/05/2010", "14/05/2010", "18/10/2003", 
         "24/10/2003", "30/10/2003", "29/04/2010", "18/10/2003"), 
        x = c(7.21, 5.99, 4.68, 3.47, 2.42, 2.72, 2.6, 2.67, 3.57, 0.428, 1.04, 0.363, 
         0.507, 0.418, 0.47, 0.646, 3.47), 
        y = c(0.651, 0.428, 1.04, 0.363, 0.507, 0.47, 646, 0.205, 0.524, 4.68, 3.47, 
         2.42, 2.52, 4.68, 3.47, 2.42, 2.52), 
      ID = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4)), 
      .Names = c("DATE", "x", "y", "ID"), 
      class = c("data.frame"), 
      row.names = c(NA, -17L)) 

# ave() takes an input object, an object of group IDs of the same length 
# as the input object, and a function to apply to the input object split across groups   
mydata$ID2 <- ave(mydata$ID, mydata$ID, FUN = length) 

mydata 

    DATE  x  y  ID ID2 
1 06/10/2003 7.210 0.651 1 5 
2 12/10/2003 5.990 0.428 1 5 
3 18/10/2003 4.680 1.040 1 5 
4 24/10/2003 3.470 0.363 1 5 
5 30/10/2003 2.420 0.507 1 5 
6 02/05/2010 2.720 0.470 2 4 
7 05/05/2010 2.600 646.000 2 4 
8 08/05/2010 2.670 0.205 2 4 
9 11/05/2010 3.570 0.524 2 4 
10 12/05/2010 0.428 4.680 3 6 
11 13/05/2010 1.040 3.470 3 6 
12 14/05/2010 0.363 2.420 3 6 
13 18/10/2003 0.507 2.520 3 6 
14 24/10/2003 0.418 4.680 3 6 
15 30/10/2003 0.470 3.470 3 6 
16 29/04/2010 0.646 2.420 4 2 
17 18/10/2003 3.470 2.520 4 2 

# if you want to replace the original ID variable, you can assign to it 
# instead of adding a new variable 
mydata$ID <- ave(mydata$ID, mydata$ID, FUN = length) 
+0

merci beaucoup. testé le résultat. Ceci est exactement ce que je cherchais. –

2

Une solution compacte avec le data.table -package:

library(data.table) 
setDT(mydf)[, ID := .N, by = ID][] 

qui donne:

> mydf 
      DATE  x  y ID 
1: 06/10/2003 7.210 0.651 5 
2: 12/10/2003 5.990 0.428 5 
3: 18/10/2003 4.680 1.040 5 
4: 24/10/2003 3.470 0.363 5 
5: 30/10/2003 2.420 0.507 5 
6: 02/05/2010 2.720 0.470 4 
7: 05/05/2010 2.600 0.646 4 
8: 08/05/2010 2.670 0.205 4 
9: 11/05/2010 3.570 0.524 4 
10: 12/05/2010 0.428 4.680 6 
11: 13/05/2010 1.040 3.470 6 
12: 14/05/2010 0.363 2.420 6 
13: 18/10/2003 0.507 2.520 6 
14: 24/10/2003 0.418 4.680 6 
15: 30/10/2003 0.470 3.470 6 
16: 29/04/2010 0.646 2.420 2 
17: 18/10/2003 3.470 2.520 2 

Ce que ceci:

  • setDT(mydf) convertit la trame de données à un groupes data.table
  • by = ID b y ID
  • ID := .N remplace la valeur d'origine de ID avec le comte par groupe