我想创建一个变量,如果在多个列中的任何一个中找到特定值,则取值为1,否则为0。这可以用ifelse
完成,但是列数超过...大约3个就变得很乏味。
我可能可以编写一个自定义函数来执行此操作,但是我很好奇tidyverse
中是否存在优雅的解决方案。
示例代码:
library(tidyverse)
example_tib <- tibble(
var0 = 1:4,
var1 = c('a', 'h', 'o', 'v'),
var2 = c('b', 'i', 'p', 'w'),
var3 = c('c', 'j', 'q', 'x'),
var4 = c('d', 'k', 'r', 'y'),
var5 = c('e', 'l', 's', 'z'),
var6 = c('f', 'm', 't', 'a'),
var7 = c('g', 'n', 'u', 'b'),
var8 = 5:8
)
variables_interest <- sprintf("%s%d", "var", 2:7)
# This doesn't work but
# shows what I want to do
example_tib %>%
mutate(pass = ifelse(any(variables_interest) <= 'o' &
any(variables_interest) > 'g', 1, 0))
所需的输出:
# A tibble: 4 x 10
var0 var1 var2 var3 var4 var5 var6 var7 var8 pass
<int> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <int> <dbl>
1 1 a b c d e f g 5 0
2 2 h i j k l m n 6 1
3 3 o p q r s t u 7 0
4 4 v w x y z a b 8 0
最佳答案
不确定它是否优雅,并假设您在第3行的值是错误的:
w <- quo(variables_interest)
example_tib %>% bind_cols(
example_tib %>% mutate(id=row_number()) %>%
gather(k,v,UQ(w)) %>%
group_by(id) %>%
summarise(pass=as.integer(sum((v>"g")&(v<="o"))>0)) %>%
select(-id))
## A tibble: 4 x 10
# var0 var1 var2 var3 var4 var5 var6 var7 var8 pass
# <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <int> <int>
#1 1 a b c d e f g 5 0
#2 2 h i j k l m n 6 1
#3 3 o p q r s t u 7 0
#4 4 v w x y z a b 8 0
关于r - 以变量向量为条件的变异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51476528/