道歉一个基本问题!
我有一组客户响应,人们应该选择一个选项,但是有些人选择的选项不只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)
答案 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]])