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)
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!
4 Réponses :
library (tidyverse) myData %>% group_by(User, App) %>% mutate (Similar = ifelse(n()>1,1,0)) %>% ungroup ()
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
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
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"))
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
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)