我有一个包含两个字段的表:
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
我感觉它由于某种矢量化问题而失败,但是我被卡住了。您知道实现我的目标的另一种更优雅的方式吗?
将named转换为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
一个base R
选项将使用stack
(而不是enframe
)和merge
。
注意:ls
是函数的名称。最好不要用函数名来命名对象标识符
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句