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)