Ответы респондентов противоречивы - держите самый низкий ответ, когда даете более одного? в R Tidyverse - PullRequest
1 голос
/ 10 апреля 2020

Извинения за базовый c вопрос!

У меня есть набор ответов клиентов, где люди должны были выбрать 1 вариант, но некоторые выбрали более 1. Для этих людей я хотел бы сохранить только самое низкое значение, которое они дали.

Я могу понять, кто выбрал больше 1, но у меня возникают проблемы с сохранением только самого низкого значения. Это немного сложно, потому что самый низкий - не цифра c - это низкий, средний, высокий в именах столбцов

#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 ]

0 голосов
/ 10 апреля 2020

Это решение может работать для вас:

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 

Это изменяет новый столбец 'lower_score' путем постепенного тестирования от низкого -> med -> high, если столбец имеет значение, равное 1. Если Столбец имеет 1, затем он прекращает поиск и записывает, в каком столбце встречается первый 1, а если столбец равен 0, он переходит к следующему столбцу. Если все 0, он сообщает "no_response". Не уверен, что вы ожидаете этого, хотя.

0 голосов
/ 10 апреля 2020

Вы можете указать, чтобы он работал rowwise() и нашел первое значение, равное единице.

library(dplyr)

df %>%
  rowwise() %>% 
  mutate(lowest = names(.)[-1][which(c(low, medium, high) == 1)[1]])
0 голосов
/ 10 апреля 2020

Вот метод tidyverse, использующий apply для считывания имени первого столбца, который содержит 1 в каждой строке:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...