2017-06-14 9 views
1

Pour chaque participant et chaque essai, je dois vérifier que pour toutes les lignes consécutives dans CURRENT_ID, la première ligne a une valeur de 0 dans la colonne A, et la dernière ligne a une valeur de 0 dans la colonne B. Si les deux conditions sont remplies, je voudrais avoir une valeur de 0 dans la nouvelle colonne C, si elles ne sont pas, je voudrais avoir une valeur de 1.comparer des lignes consécutives à des conditions spécifiques dans R

Si vous en avez suggestions, je serais très reconnaissant.

Voici quelques exemples de lignes de données:

A B participant trial CURRENT_ID  C 
0 1 ppt01   45  3    0 
1 0 ppt01   45  4    0 
0 1 ppt01   45  10    0 
0 0 ppt01   45  11    0 
1 0 ppt01   45  12    0 
0 1 ppt01   87  2    0 
1 0 ppt01   87  3    0 
1 1 ppt01   87  4    1 
1 1 ppt01   87  5    1 
0 1 ppt01   34  6    0 
0 0 ppt01   34  7    0 
0 0 ppt01   34  8    0 
0 0 ppt01   34  9    0 
0 0 ppt01   34  10    0 
1 0 ppt01   34  11    0 
0 1 ppt01   8  5    0 
1 0 ppt01   8  6    0 
0 1 ppt01   8  9    0 
0 0 ppt01   8  10    0 
0 0 ppt01   8  11    0 
1 0 ppt01   8  12    0 
0 1 ppt02   87  2    0 
0 0 ppt02   87  3    0 
0 0 ppt02   87  4    0 
1 0 ppt02   87  5    0 
0 1 ppt02   55  5    0 
1 0 ppt02   55  6    0 
0 1 ppt02   55  9    0 
1 0 ppt02   55  10    0 
0 1 ppt02   55  11    1 
1 0 ppt02   55  12    0 
0 1 ppt02   22  2    0 
1 0 ppt02   22  3    0 
0 1 ppt02   22  4    1 
0 1 ppt02   22  10    0 
1 0 ppt02   22  11    1 
1 1 ppt02   22  12    1 

EDIT: Je dois considérer chaque paire de lignes consécutives (consécutives sur la base des valeurs de CURRENT_ID) pour chaque participant et le procès. Dans l'exemple ci-dessus, les lignes 8 et 9 ont la valeur 1 dans la nouvelle colonne C car la ligne 8 a 1 (au lieu de 0) dans la colonne A et la ligne 9 1 (au lieu de 0) dans la colonne B.

A B participant trial CURRENT_ID  C 
1 1 ppt01   87  4    1 
1 1 ppt01   87  5    1 

EDIT2: Après que je dois prendre en compte les paires de lignes:

A B participant trial CURRENT_ID  C 
0 1 ppt01   45  3    0 
1 0 ppt01   45  4    0 

0 1 ppt01   45  10    0 
0 0 ppt01   45  11    0 

0 0 ppt01   45  11    0 
1 0 ppt01   45  12    0 

0 1 ppt01   87  2    0 
1 0 ppt01   87  3    0 

1 0 ppt01   87  3    0 
1 1 ppt01   87  4    1 

1 1 ppt01   87  4    1 
1 1 ppt01   87  5    1 

0 1 ppt01   34  6    0 
0 0 ppt01   34  7    0 

0 0 ppt01   34  7    0 
0 0 ppt01   34  8    0 

0 0 ppt01   34  8    0 
0 0 ppt01   34  9    0 

0 0 ppt01   34  9    0 
0 0 ppt01   34  10    0 

0 0 ppt01   34  10    0 
1 0 ppt01   34  11    0 
+0

essayez-vous de faire cela par 'participant' et/ou' trial'? aussi essayez-vous de le faire pour des valeurs consécutives de 'CURRENT_ID'? – akash87

+0

est la colonne C fourni dans les données correctes - pourquoi la rangée 8,9 obtenir un 1 - ne correspond pas à la description pour moi !? – BigDataScientist

+0

@ akash87 Je dois considérer les valeurs consécutives de CURRENT_ID pour chaque participant et essai. – dede

Répondre

1

Si vous souhaitez paires de groupes de AB au sein des groupes de participants au procès, cela devrait fonctionner:

d %>% group_by(participant, trial) %>% mutate(AB = ceiling(1:n()/2)) %>% group_by(participant, trial, AB) %>% mutate(newC = ifelse(length(A) == 1 | (A[1] == 0 & B[2] == 0), 0, 1)) 

J'ai laissé les nouvelles colonnes dans donc vous pouvez voir comment cela a été fait.

Sortie:

# A tibble: 15 x 8 
     A  B participant trial CURRENT_ID  C AB newC 
    <int> <int>  <chr> <int>  <int> <int> <dbl> <dbl> 
1  0  1  ppt01 45   3  0  1  0 
2  1  0  ppt01 45   4  0  1  0 
3  0  1  ppt01 45   10  0  2  0 
4  0  0  ppt01 45   11  0  2  0 
5  1  0  ppt01 45   12  0  3  0 
6  0  1  ppt01 87   2  0  1  0 
7  1  0  ppt01 87   3  0  1  0 
8  1  1  ppt01 87   4  1  2  1 
9  1  1  ppt01 87   5  1  2  1 
10  0  1  ppt01 34   6  0  1  0 
11  0  0  ppt01 34   7  0  1  0 
12  0  0  ppt01 34   8  0  2  0 
13  0  0  ppt01 34   9  0  2  0 
14  0  0  ppt01 34   10  0  3  0 
15  1  0  ppt01 34   11  0  3  0 

Dans le cas contraire, comme cela a été décrit à l'origine:

require(dplyr) 
d %>% group_by(participant, trial) %>% mutate(newC = ifelse(A[1] == 0 & B[n()] == 0, 0, 1)) 

Sortie:

Source: local data frame [15 x 7] 
Groups: participant, trial [3] 

# A tibble: 15 x 7 
     A  B participant trial CURRENT_ID  C newC 
    <int> <int>  <chr> <int>  <int> <int> <dbl> 
1  0  1  ppt01 45   3  0  0 
2  1  0  ppt01 45   4  0  0 
3  0  1  ppt01 45   10  0  0 
4  0  0  ppt01 45   11  0  0 
5  1  0  ppt01 45   12  0  0 
6  0  1  ppt01 87   2  0  1 
7  1  0  ppt01 87   3  0  1 
8  1  1  ppt01 87   4  1  1 
9  1  1  ppt01 87   5  1  1 
10  0  1  ppt01 34   6  0  0 
11  0  0  ppt01 34   7  0  0 
12  0  0  ppt01 34   8  0  0 
13  0  0  ppt01 34   9  0  0 
14  0  0  ppt01 34   10  0  0 
15  1  0  ppt01 34   11  0  0 

J'ai utilisé un sous-ensemble de données à l'aide dput():

d <- structure(
    list(
    A = c(0L, 1L, 0L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 
      0L, 0L, 0L, 0L, 1L), 
    B = c(1L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 1L, 
      1L, 0L, 0L, 0L, 0L, 0L), 
    participant = c(
     "ppt01", 
     "ppt01", 
     "ppt01", 
     "ppt01", 
     "ppt01", 
     "ppt01", 
     "ppt01", 
     "ppt01", 
     "ppt01", 
     "ppt01", 
     "ppt01", 
     "ppt01", 
     "ppt01", 
     "ppt01", 
     "ppt01" 
    ), 
    trial = c(
     45L, 
     45L, 
     45L, 
     45L, 
     45L, 
     87L, 
     87L, 
     87L, 
     87L, 
     34L, 
     34L, 
     34L, 
     34L, 
     34L, 
     34L 
    ), 
    CURRENT_ID = c(3L, 4L, 10L, 11L, 12L, 2L, 3L, 4L, 5L, 6L, 
        7L, 8L, 9L, 10L, 11L), 
    C = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
      1L, 0L, 0L, 0L, 0L, 0L, 0L) 
), 
    .Names = c("A", "B", "participant", 
      "trial", "CURRENT_ID", "C"), 
    class = "data.frame", 
    row.names = c(NA,-15L) 
) 
+1

Pour moi, la ligne 6-9 ne devrait pas avoir un 1 pour la ligne 'newC'. Est-ce que vous faites également partie du groupe «trial» ou est-ce que je suis en train de perdre sthg? – BigDataScientist

+0

Oui, il a dit qu'il voulait que les deux conditions soient remplies. S'il a l'intention d'autre chose, il devra clarifier. – ssp3nc3r

+0

oh mon garçon, il est temps de dormir. Sry pour déranger;) – BigDataScientist