1
votes

Réponses incohérentes des répondants - garder la réponse la plus basse quand on en donne plus d'une? dans R Tidyverse

Toutes mes excuses pour une question de base!

J'ai un ensemble de réponses de clients où les gens étaient censés choisir une option, mais certains en ont choisi plus de 1. Pour ces personnes, je voudrais ne garder que la valeur la plus basse qu'ils ont donnée .

Je peux déterminer qui en a choisi plus d'un, mais j'ai du mal à ne conserver que la valeur la plus basse. C'est un peu délicat car le plus bas n'est pas numérique - il est faible, moyen, élevé dans les noms de colonnes

#this is what I have
people <- c("Anne", "Betty", "Carol")
low <- c(1, 1, 0)
medium <- c(1, 0, 0)
high <- c(0, 1, 1)

df <- data.frame(people, low, medium, high)


0 commentaires

3 Réponses :


0
votes

Voici une méthode tidyverse utilisant apply pour lire le nom de la première colonne qui contient un 1 dans chaque ligne:

df %>% 
  mutate(lowest = apply(.[,-1], 1, function(x) names(.)[-1][which(x == 1)[1]]))
#>   people low medium high lowest
#> 1   Anne   1      1    0    low
#> 2  Betty   1      0    1    low
#> 3  Carol   0      0    1   high

p>


0 commentaires

0
votes

Cette solution peut fonctionner pour vous:

library(tidyverse)
people <- c("Anne", "Betty", "Carol", "Darrel")
low <- c(1, 1, 0, 0)
medium <- c(1, 0, 0, 0)
high <- c(0, 1, 1, 0)

df <- tibble(people, low, medium, high) 

df %>% dplyr::mutate(lowest_score = ifelse(low == 1, "low",
     ifelse(medium == 1, "medium", 
     ifelse(high == 1, "high", "no_response"))))

# A tibble: 4 x 5
  people   low medium  high lowest_score
  <chr>  <dbl>  <dbl> <dbl> <chr>       
1 Anne       1      1     0 low         
2 Betty      1      0     1 low         
3 Carol      0      0     1 high        
4 Darrel     0      0     0 no_response 

Cela fait muter une nouvelle colonne 'plus bas_score' en testant progressivement de low -> med -> high si la colonne a une valeur égale à 1. Si la colonne a un 1, elle cesse de chercher et enregistre quelle colonne le premier 1 apparaît, et si la colonne est 0, elle passe à la colonne suivante. Si tout est 0, il signale "no_response". Je ne sais pas si vous prévoyez cela.


0 commentaires

0
votes

Vous pouvez lui dire d'opérer rowwise () et de trouver la première valeur égale à un.

library(dplyr)

df %>%
  rowwise() %>% 
  mutate(lowest = names(.)[-1][which(c(low, medium, high) == 1)[1]])


0 commentaires