0
votes

Comment étiqueter la même valeur avec un utilisateur spécifique dans R?

J'ai quelque chose comme dataframe:

> myData

  User App       Similiar
1  A   Wa           1
2  A   Browsing     1
3  A   Wa           1
4  A   Browsing     1
5  A   Ig           0
6  A   Tel          0
7  B   Youtube      0 
8  B   Ig           0
9  B   Wa           0

À quelque chose comme ça:

myData <-  "User App
            A   Wa
            A   Browsing
            A   Wa
            A   Browsing
            A   Ig
            A   Tel
            B   Youtube
            B   Ig
            B   Wa"

myData <- read.table(text = myData, header = TRUE)

Question

Je veux étiqueter dans une colonne similaire . Si le même utilisateur a la même application, il recevra l'étiquette 1 ou s'il n'y a pas la même application pour cet utilisateur, elle recevra l'étiquette 0 . Par exemple, comme l'utilisateur B, les applications de l'utilisateur B sont toutes différentes, elles seront donc étiquetées 0.

Une idée sur la façon de procéder?

Merci d'avance!

r

0 commentaires

4 Réponses :


0
votes
library (tidyverse)

myData %>% group_by(User, App) %>% 
mutate (Similar = ifelse(n()>1,1,0)) %>% ungroup ()

2 commentaires

Anil, s'il y a plus de 2 occurrences d'une application, votre code peut ne pas donner la sortie attendue par l'OP. Par exemple, si vous remplacez «Ig» par un autre «Wa» dans le groupe A, le nombre de «Wa» est 3, votre code donnera une valeur de colonne similaire à 2 et non à 1.


Merci d'avoir répondu



0
votes

Est-ce que ça marche:

library(dplyr)
df %>% group_by(User, App) %>% mutate(c = n()) %>% 
mutate(Similar = case_when(c > 1 ~ 1, TRUE ~ 0)) %>% select(-c)
# A tibble: 9 x 3
# Groups:   User, App [7]
  User  App      Similar
  <chr> <chr>      <dbl>
1 A     Wa             1
2 A     Browsing       1
3 A     Wa             1
4 A     Browsing       1
5 A     Ig             0
6 A     Tel            0
7 B     Youtube        0
8 B     Ig             0
9 B     Wa             0


0 commentaires

0
votes

Une option avec base R utilisant ave

myData <- structure(list(User = c("A", "A", "A", "A", "A", "A", "B", "B", 
"B"), App = c("Wa", "Browsing", "Wa", "Browsing", "Ig", "Tel", 
"Youtube", "Ig", "Wa")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9"))

Les données

myData$Similar <- with(myData, +(ave(seq_along(User),
       User, App, FUN = length) > 1))
myData$Similar
#[1] 1 1 1 1 0 0 0 0 0


0 commentaires

0
votes

Voici une solution utilisant les dplyr et data.table . Nous convertissons d'abord en une table groupée à l'aide des variables User et App . Ensuite , nous utilisons mutate du dplyr package pour ajouter deux nouvelles variables. Le premier est Similar_1 qui utilise rowid du package data.table pour appliquer des identifiants de ligne uniques dans chaque groupement. Le second est Similar qui utilise un ifelse et un max de la base r pour appliquer un 1 pour les groupes avec une valeur de rowid max> 1 et 0 pour tout le reste. Select dans le package dplyr est utilisé pour sous-ensemble les données en supprimant la variable Similar_1 .

Code:

#>   User      App
#> 1    A       Wa
#> 2    A Browsing
#> 3    A       Wa
#> 4    A Browsing
#> 5    A       Ig
#> 6    A      Tel
#> 7    B  Youtube
#> 8    B       Ig
#> 9    B       Wa

Production:

#> # A tibble: 9 x 3
#> # Groups:   User, App [7]
#>   User  App      Similar
#>   <chr> <chr>      <dbl>
#> 1 A     Wa             1
#> 2 A     Browsing       1
#> 3 A     Wa             1
#> 4 A     Browsing       1
#> 5 A     Ig             0
#> 6 A     Tel            0
#> 7 B     Youtube        0
#> 8 B     Ig             0
#> 9 B     Wa             0

Créé le 2020-11-14 par le package reprex (v0.3.0)

Données d'origine:

library(dplyr)
library(data.table)

df <-  "User App
        A   Wa
        A   Browsing
        A   Wa
        A   Browsing
        A   Ig
        A   Tel
        B   Youtube
        B   Ig
        B   Wa"

df <- read.table(text = df, header = TRUE)


df %>% 
  group_by(User, App) %>% 
  mutate(
    Similar_1 = rowid(App),
    Similar = ifelse(max(Similar_1) > 1, 1, 0)
  ) %>% 
  select(-Similar_1)


0 commentaires