Mam dataframe w R. Istnieje lista klientów i pakiet usług, których używali do miesiąca od stycznia do sierpnia, jeśli jeden klient użył tej samej usługi, wszystkie 8 miesiące, chcę umieścić nazwę tej usługi do kolumny o nazwie PU. Na przykład, jak widać na obrazie, Klient5 Używane usługi standardowe Wszystkie 8 miesiące, w rezultacie widzimy "Standard" w kolumnie PU.

Próbowałem poniższego kodu, ale działało tylko za pierwszy i ostatni miesiąc:

Database$PU[Database[, 2] == "Standard" & Database[, 3] == "Standard" &
Database[, 4] == "Standard" & Database[, 5] == "Standard" & 
Database[, 6] == "Standard" & Database[, 7] == "Standard" & 
Database[, 8] == "Standard" & Database[, 9] == "Standard"] <- "Standard"

Jak mogę to rozwiązać? Czy to możliwe, nie tworząc nowej Dataframe?

enter image description here

r
0
Asem Ka 16 grudzień 2019, 08:58

1 odpowiedź

Najlepsza odpowiedź

Możemy użyć apply wiersz, aby przypisać unikalną wartość w wierszu do nowej kolumny, jeśli ma taką samą wartość w całym wierszu.

df$PU <- apply(df[2:9], 1, function(x) if(length(unique(x)) == 1) unique(x) else '')
df

#  clients      jan      feb      mar      apr      may      jun      jul      aug       PU
#1 client1 standard standard standard standard standard standard standard standard standard
#2 client2    super    super    super standard    start    start    start    start         
#3 client3    start    start    start standard    super    start    start    start         
#4 client4    super standard    start    start    super    start    super    super         
#5 client5    super    super    super    super    super    super    super    super    super

Możemy użyć podobnego podejścia za pomocą dplyr po zbieraniu danych w dłuższym formacie.

library(dplyr)
df %>%
 tidyr::pivot_longer(cols = 2:9) %>%
 group_by(clients) %>%
 summarise(PU = if(n_distinct(value) == 1) unique(value) else '') %>%
 left_join(df)

dane

df <- data.frame(clients = paste0('client', 1:5), 
             jan = c('standard', 'super', 'start', 'super', 'super'), 
             feb = c('standard', 'super', 'start', 'standard', 'super'), 
             mar = c('standard', 'super', 'start', 'start', 'super'), 
             apr = c('standard', 'standard', 'standard', 'start', 'super'), 
             may = c('standard', 'start', 'super', 'super', 'super'), 
             jun = c('standard', 'start', 'start', 'start', 'super'), 
             jul = c('standard', 'start', 'start', 'super', 'super'), 
             aug = c('standard', 'start', 'start', 'super', 'super'), 
             stringsAsFactors = FALSE)
1
Ronak Shah 16 grudzień 2019, 07:00