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)
3 Réponses :
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>
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.
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]])