受访者的答案不一致-给出多个答案时,答案保持最低?在R Tidyverse中

时间:2020-04-10 10:46:12

标签: r tidyverse

道歉一个基本问题!

我有一组客户响应,人们应该选择一个选项,但是有些人选择的选项不只1个。对于这些人,我只想保持他们给出的最低价值。

我可以找出谁选择了大于1的值,但是我很难仅保留最低值。这有点棘手,因为最低值不是数字-列名中的低,中,高

#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 :(得分:0)

这是一种使用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

答案 1 :(得分:0)

此解决方案可能适合您:

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 

如果该列的值等于1,则通过从低->中->高逐步进行测试,从而对新列'lowest_score'进行突变。如果该列的值等于1,则该列将停止查找并记录第一个出现的列,如果该列为0,则移至下一列。如果全为0,则报告“ no_response”。不确定是否可以预期。

答案 2 :(得分:0)

您可以告诉它操作rowwise()并找到等于1的第一个值。

library(dplyr)

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