У меня есть таблица с двумя полями:
dd <- data.frame(measure = c("a", "a", "b", "b", "c", "c"), class = c(1,11,2,22,3,33), stringsAsFactors = F)
dd
measure class
1 a 1
2 a 11
3 b 2
4 b 22
5 c 3
6 c 33
Для каждого measure
ассоциируется class
.Однако не все class
могут быть связаны с каждым значением measure
.На самом деле, только допустимые значения для меры доступны в list
:
ls <- list(a=c(1,10), b=c(2,20,200), c=c(3,30,90))
ls
$`a`
[1] 1 10
$b
[1] 2 20 200
$c
[1] 3 30 90
Мне нужно стереть (заменить на NA) меру, в которой класс как не совпадает в списке.Я преуспел в базовом R:
good_match <- mapply(function(xx, yy) any(xx %in% yy), ls[dd$measure], dd$class)
dd$measure[!good_match] <- NA
dd
measure class
1 a 1
2 <NA> 11
3 b 2
4 <NA> 22
5 c 3
6 <NA> 33
Однако я хотел бы сделать это в dplyr
, возможно, с mutate
, поэтому я могу передать это и сделать так, чтобы он лучше подходил моему сценарию.Я пробовал:
library(dplyr)
dd %>% mutate(measure = ifelse(any(class %in% ls[[measure]]), measure, NA))
Error in ls[[measure]] : recursive indexing failed at level 2
У меня такое ощущение, что это не получается из-за какой-то проблемы векторизации, но я застрял.Вы знаете другой, более изящный способ достижения моей цели?