我有一个包含组的数据集--"a"、"B"、"C"和"a&B"--在两个时间点--"之前"和"之后".如果A或B在任一时间点的样本量低于10人,我只想包括"A&B".否则,我想删除"A&B"组.我如何告诉R只有在满足其他标准的情况下才删除该组?

这里有两个样本数据集——其中一个应该过滤掉A组;B和一个应保留的位置:

library(dplyr)

#This should not filter out anything

should_not_drop_group <- tibble(group = rep(c("A", "B", "C", "A & B"), 2),
                    time = c(rep(c("Before"), 4), rep(c("After"), 4)),
                    sample_size = c(5, 100, 132, 105, 250, 50, 224, 300))


#This dataset should drop group A&B

should_drop_group <- tibble(group = rep(c("A", "B", "C", "A & B"), 2),
                                                  time = c(rep(c("Before"), 4), rep(c("After"), 4)),
                                                  sample_size = c(500, 100, 132, 600, 250, 50, 224, 300))

这就是为什么我试着无济于事:

library(dplyr)

should_drop_group %>%
  filter_if(~any(sample_size[group  %in% c("A", "B")] < 10), group != "A & B" )

推荐答案

可能filter中的条件是-将sample_size小于10的group子集,判断该组中是否有any个"A"、"B"值,取反(!),然后创建第二个表达式,其中group是"A&B",将它们与&连接,然后取反(!)整个表达式以过滤掉这些情况

library(dplyr)
should_not_drop_group %>% 
   filter(!(!any(c("A", "B") %in% group[sample_size < 10]) & group == "A & B"))
   # or can be written as
   #filter(!(!any(group %in% c("A", "B") & sample_size < 10) & group == "A & B"))

-输出

# A tibble: 8 × 3
  group time   sample_size
  <chr> <chr>        <dbl>
1 A     Before           5
2 B     Before         100
3 C     Before         132
4 A & B Before         105
5 A     After          250
6 B     After           50
7 C     After          224
8 A & B After          300

第二种情况

should_drop_group %>% 
    filter(!(!any(c("A", "B") %in% group[sample_size < 10]) & group == "A & B"))
# A tibble: 6 × 3
  group time   sample_size
  <chr> <chr>        <dbl>
1 A     Before         500
2 B     Before         100
3 C     Before         132
4 A     After          250
5 B     After           50
6 C     After          224

如果我们想在多个数据集上重用它,那么创建一个函数并重用它

> f1 <- function(x, sample_size) 
   !(!any(c("A", "B") %in% x[sample_size < 10]) & x == "A & B")
> should_not_drop_group %>% 
   filter(if_any(group, f1, sample_size = sample_size))
# A tibble: 8 × 3
  group time   sample_size
  <chr> <chr>        <dbl>
1 A     Before           5
2 B     Before         100
3 C     Before         132
4 A & B Before         105
5 A     After          250
6 B     After           50
7 C     After          224
8 A & B After          300
> should_drop_group %>% 
   filter(if_any(group, f1, sample_size = sample_size))
# A tibble: 6 × 3
  group time   sample_size
  <chr> <chr>        <dbl>
1 A     Before         500
2 B     Before         100
3 C     Before         132
4 A     After          250
5 B     After           50
6 C     After          224

R相关问答推荐

向gggplot 2中的数据和轴标签添加大写和星号

如何将dygraph调用到R Markdown作为一个shiny 的react 对象的参数?

我不能在docker中加载sf

如何根据R中其他列的值有条件地从列中提取数据?

如何在一次运行中使用count进行多列计数

计算时间段的ECDF(R)

使用整齐的计算(curl -curl )和杂音

将. xlsx内容显示为HTML表

根据现有列的名称和字符串的存在进行变异以创建多个新列

使用for循环和粘贴创建多个变量

是否有新方法来更改Facet_WRAP(Ggplot2)中条文本的文本 colored颜色 ?

根据另一列中的值和条件查找新列的值

按组计算列中1出现的间隔年数

将多个变量组合成宽格式

如何删除设置大小的曲线图并添加条形图顶部数字的百分比

如何使用循环从R中的聚合函数创建列,而不会在名称中给出&q;$&q;?

使用R、拼图和可能的网格包绘制两个地块的公共垂直线

组合名称具有模式的列表的元素

对数据帧中的列进行子集设置以通过迭代创建新的数据帧

如何将数据框压缩为更宽,同时将行输入保持为行输入,而不是R中的列名?