我想使用命名列表过滤特定变量组合的嵌套数据帧,但我无法排除一些不需要的组合.下面是一个例子:

library(tidyverse)

# Create fake data
set.seed(1234)
data <- tibble(
    c1 = rep(letters[1:3], each = 10),
    c2 = sample(letters[4:6], size = 30, replace = T),
    var1 = rnorm(30),
    var2 = rnorm(30)
)
nested_data <- data %>% 
    nest(.by = c(c1, c2))

# Create list of the specific combinations I want
criteria <- list(a = c("d", "e"), b = "d")

我try 使用函数names()unique()来执行此操作,但结果并不排除带有重叠标准的不需要的组合.

# Filter for the specific combinations
c1_criteria <- names(criteria)
c2_criteria <- unique(unlist(criteria))
nested_data %>% 
    filter(c1 %in% c1_criteria,
           c2 %in% c2_criteria) %>% 
    unnest(data)

这是输出

# A tibble: 4 × 3
  c1    c2    data            
  <chr> <chr> <list>          
1 a     e     <tibble [5 × 2]>
2 a     d     <tibble [3 × 2]>
3 b     e     <tibble [6 × 2]>
4 b     d     <tibble [1 × 2]>

I intended to have only the following combinations :
c1 == "a" & c2 == "d", c1 == "a" & c2 == "e", c1 == "b" & c2 == "d"

但是,输出还包括组合c1 == "b" & c2 == "e".因此,预期的输出如下:

# A tibble: 3 × 3
  c1    c2    data            
  <chr> <chr> <list>          
1 a     e     <tibble [5 × 2]>
2 a     d     <tibble [3 × 2]>
3 b     d     <tibble [1 × 2]>

我认为可能有一种方法可以从命名列表criterias生成特定逻辑条件的列表,并将其作为参数提供给过滤器函数,但我不确定如何做到这一点.

推荐答案

我们可以将该列表转换为包含所需c1和c2组合的两列筛选表,然后可以将其用于semi_join():

library(tidyverse)

set.seed(1234)
data <- tibble(
  c1 = rep(letters[1:3], each = 10),
  c2 = sample(letters[4:6], size = 30, replace = T),
  var1 = rnorm(30),
  var2 = rnorm(30)
)
nested_data <- data %>% 
  nest(.by = c(c1, c2))

criteria <- list(a = c("d", "e"), b = "d")

enframe(criteria, "c1", "c2") %>% 
  unnest(c2) %>% 
  semi_join(nested_data, .)
#> Joining with `by = join_by(c1, c2)`
#> # A tibble: 3 × 3
#>   c1    c2    data            
#>   <chr> <chr> <list>          
#> 1 a     e     <tibble [5 × 2]>
#> 2 a     d     <tibble [3 × 2]>
#> 3 b     d     <tibble [1 × 2]>

列出转换步骤:

enframe(criteria, name = "c1", value = "c2")
#> # A tibble: 2 × 2
#>   c1    c2       
#>   <chr> <list>   
#> 1 a     <chr [2]>
#> 2 b     <chr [1]>

enframe(criteria, "c1", "c2") %>% unnest(c2)
#> # A tibble: 3 × 2
#>   c1    c2   
#>   <chr> <chr>
#> 1 a     d    
#> 2 a     e    
#> 3 b     d

创建于2023-10-02,带有reprex v2.0.2

R相关问答推荐

将coord_sf与geom_spatraster一起使用会更改分辨率

使用split.zoo界定xts物体的降水事件

修改dDeliverr中列表列的最后一个元素

按崩溃类别分类的指数

给定R中另一行中的值,如何插补缺失值

在特定列上滞后n行,同时扩展框架的长度

如何使用R中的dhrr函数将李克特量表的因子列从长转换为宽?

用derrr在R中查找组间的重复项

r替换lme S4对象的字符串的一部分

如何在R中对深度嵌套的tibbles中的非空连续行求和?

如何使用ggplot对堆叠条形图进行嵌套排序?

如何同时从多个列表中获取名字?

try 将 colored颜色 编码添加到ggploly的标题中

观察器中的inaliateLater的位置

远离理论值的伽马密度曲线下面积的近似

解析嵌套程度极高的地理数据

R -基线图-图形周围的阴影区域

如何预测原始数据集并将值添加到原始数据集中

如何判断代码是否在R Markdown(RMD)上下文中交互运行?

R-使用stri_trans_General()将其音译为德语字母