2017-10-11 1 views
-1

Je cette dataframe:dataframe ayant des éléments de liste et nous vérifions une valeur y est présent ou non dans chaque ligne que DF

df = structure(list(session_id = 1:14, rv = list(c(1, 2, 3), 4, c(5, 
6), c(7, 8), 5, c(9, 6, 10, 10), c(9, 6), c(11, 9, 12, 13), c(8, 
3, 9), 3, 14, c(13, 11, 15), c(6, 6), 16)), row.names = c(NA, 
14L), vars = list(session_id), drop = TRUE, .Names = c("session_id", 
"rv"), class = c("rowwise_df", "tbl_df", "tbl", "data.frame")) 

Maintenant, je veux vérifier si la valeur 9 est présent dans ce rv colonnes regroupées par ID de session. Par exemple. vérification de la première ligne rv [[1]] 9 n'est pas présent retour 0 .Au reste de vérification pour la 2e rangée rv [[2]] 9 n'est pas présent .... dans la 6ème rangée rv [[6]] 9 est présent donc retourne son position d'index 1 ... De même dans la 9ème rangée de rv [[9]] 9 est présent au 3ème indice le renvoyer ....... Donc l'idée est si la valeur 9 est présente dans la position d'index de retour rv sinon retourner 0. J'espère que cela suffira à expalin ce que l'idée est.

Vous cherchez dplyr way.

Répondre

0

En utilisant une combinaison de dplyr et purrr vous pouvez essayer:

df %>% ungroup() %>% 
    mutate(index = map_int(rv, function(l) if_else(any(l == 9), which.max(l == 9), 0L))) 

# A tibble: 14 x 3 
    session_id  rv index 
     <int> <list> <int> 
1   1 <dbl [3]>  0 
2   2 <dbl [1]>  0 
3   3 <dbl [2]>  0 
4   4 <dbl [2]>  0 
5   5 <dbl [1]>  0 
6   6 <dbl [4]>  1 
7   7 <dbl [2]>  1 
8   8 <dbl [4]>  2 
9   9 <dbl [3]>  3 
10   10 <dbl [1]>  0 
11   11 <dbl [1]>  0 
12   12 <dbl [3]>  0 
13   13 <dbl [2]>  0 
14   14 <dbl [1]>  0 

Ici, j'utiliser map_int parce que l'entrée est une liste et vous voulez avoir un entier en sortie.
Dans le cas où il y a plusieurs 9 dans l'un des vecteurs, il retourne le premier index.

Je devais utiliser ungroup car votre data.de nom est un "rowwise_df".

+0

ouais votre réponse est utile mais la liste rv en quelque sorte triée dans l'ordre croissant et donnant des index pas réels .. vous regardez la sortie .Pour 6 et 7 rangs 9 était 1 élément – SumitArya

+0

Ouais, vous avez raison! Cela est arrivé, parce que j'ai utilisé 'which.min', au lieu de' which.max'. 'which.max' trouve le premier index qui est TRUE,' which.min' renvoie le premier index qui est FALSE. – kath