1

为一个基本问题道歉!

我有一组客户响应,其中人们应该选择 1 个选项,但有些人选择了 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)
4

3 回答 3

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,则它停止查找并记录第一个 1 出现的列,如果该列是 0 它移动到下一列。如果全为 0,则报告“no_response”。不确定你是否预料到这一点。

于 2020-04-10T11:24:16.857 回答
0

这是一个 tidyverse 方法,用于读取每行apply中包含 a 的第一列的名称: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
于 2020-04-10T10:59:25.003 回答
0

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

library(dplyr)

df %>%
  rowwise() %>% 
  mutate(lowest = names(.)[-1][which(c(low, medium, high) == 1)[1]])
于 2020-04-10T13:13:01.510 回答