【问题标题】:dplyr: Groupwise subtraction of values (based on pre-filtered rows)dplyr:值的分组减法(基于预过滤的行)
【发布时间】:2018-09-21 07:11:34
【问题描述】:

我被困在(可能)非常明显的事情上,但我无法弄清楚实际问题是什么。

DF <- data.frame(Gene = c(rep("A",8), rep("X",8)),
             Genotype = c(rep("WT",4),rep("mut",4),rep("WT",4),rep("mut",4)),
             TimePoint = c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4),
             Value = c(12.5,12.33,11,10,23.22,22,21.2,45.3,22,12,23,21.2,23.2,45.3,21,22))

我想做什么: 从组内的所有值中减去对应于 TimePoint == 1 的值(这里:Group = Gene, Genotype)。

我希望在此处显示此代码的结果:

DF %>% group_by(Gene, Genotype) %>% mutate(Diff = Value - first(Value))

但是,我会根据给定的 TimePoint 选择值,而不是第一个函数,该 TimePoint 不一定必须是每个组中的第一个。

我的想法是做这样的事情,但实际上它并没有像预期的那样使用分组数据:

DF %>% group_by(Gene, Genotype) %>% mutate(Diff = Value - filter(.,TimePoint == 1)$Value)

我真的不知道为什么分组数据没有正确传送到过滤器语句?

【问题讨论】:

    标签: r filter group-by dplyr


    【解决方案1】:

    在分组步骤之后,通过使用“TimePoint”创建一个逻辑向量来子集“Value”,即TimePoint == 1,然后从“Value”中减去它

    DF %>%
       group_by(Gene, Genotype) %>%
       mutate((Diff = Value - Value[TimePoint == 1]))
    

    或者另一个选项是match 来获取索引

    DF %>%
       group_by(Gene, Genotype) %>% 
       mutate((Diff = Value - Value[match(1, TimePoint)]))
    

    如果我们真的需要使用filter,那么过滤数据集,然后做一个right_join并得到差异

    DF %>%
       filter(TimePoint == 1) %>% 
       select(Gene, Genotype, Value1 = Value)  %>% 
       right_join(DF) %>% 
       mutate(Diff = Value - Value1) %>%
       select(-Value1)
    

    filter 之后的filter OP 的提取“值”不遵循group_by 约束,它只是通过回收来减去

    【讨论】:

    • 非常感谢 :) 在这种情况下,有没有办法可以使用“过滤器”而不是“基本”语法。我的主要问题也是要了解为什么“过滤器”在这里不起作用
    • @interrobang pipe 的主要吸引力之一是使流程更易于阅读。通过在管道中嵌套多个函数使其难以阅读
    • @count 这已经在 OP 的帖子中了。我认为 OP 想根据“时间点”做一些filtering
    猜你喜欢
    • 1970-01-01
    • 2015-05-08
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多