Стирание значения в одной переменной, если значения в другой переменной не совпадают в списке в dplyr - PullRequest
2 голосов
/ 02 апреля 2019

У меня есть таблица с двумя полями:

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

У меня такое ощущение, что это не получается из-за какой-то проблемы векторизации, но я застрял.Вы знаете другой, более изящный способ достижения моей цели?

1 Ответ

2 голосов
/ 02 апреля 2019

Мы можем использовать объединение после преобразования именованного list в tibble / data.frame

library(tidyverse)
enframe(ls,  value = 'class') %>%
   unnest %>%
   right_join(dd, by = 'class') %>%
   transmute(measure = name, class)
# A tibble: 6 x 2
#  measure class
#  <chr>   <dbl>
#1 a           1
#2 <NA>       11
#3 b           2
#4 <NA>       22
#5 c           3
#6 <NA>       33

Опция

A base R будет использовать stack (вместо enframe) и merge.

ПРИМЕЧАНИЕ. ls - это название функции. Лучше не называть идентификаторы объектов именами функций

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...