【问题标题】:Group_by and filter or nest in tidyverse. How to unfilter() and then filter() again?Group_by 和过滤或嵌套在 tidyverse 中。如何取消过滤()然后再次过滤()?
【发布时间】:2021-01-28 07:29:51
【问题描述】:

在应用于心理学的数据分析中,我们经常想要检查每个主题的所有结果。因此,假设我有这个数据集:

library(tidyverse)
set.seed(123)
ds <- data.frame(subject = rep(1:4, each=4),
                 metadata = c("congruent_1","congruent_2","incongruent_1", "incongruent_2"),
                 reaction_time = rnorm(16,mean = 0.1, sd=0.02))

我可以得到按每个主题分组的均值和标准差

#mean
ds %>% 
  group_by(subject) %>% 
  filter(metadata == "congruent_1" | metadata == "congruent_2") %>% 
  summarise(mean_cong = mean(reaction_time))
#sd
ds %>% 
  group_by(subject) %>% 
  filter(metadata =="incongruent_1" | metadata == "incongruent_2") %>% 
  summarise(sd_cong_incong = sd(reaction_time))

但是,现在我需要用mean_cong / sd_cong_incong 的结果计算一个变量。我确信这可以通过 group_bynest 实现,但我没有得到正确的代码来运行它。

一个假代码将是

ds %>% 
  group_by(subject) %>% 
  filter(metadata == "congruent_1" | metadata == "congruent_2") %>% 
  summarise(mean_cong = mean(reaction_time)) %>% 
  unfilter() %>% #<- I know this is not possible
  filter(metadata =="incongruent_1" | metadata == "incongruent_2") %>% 
  summarise(sd_cong_incong = sd(reaction_time)) %>% 
  mutate(pooled = mean_cong/sd_cong_incong)

假输出将是:

我想留在 tidyverse 环境中。 谢谢。

【问题讨论】:

  • 您的意思是用sd(reaction_time) 而非mean(reaction_time) 来计算标准差,还是我误解了您的问题?
  • 是的。谢谢。我改变了问题。

标签: r dplyr group-by tidyverse


【解决方案1】:

您可以像这样在汇总表达式中包含逻辑:

ds %>% 
    dplyr::group_by(subject) %>% 
    dplyr::summarise(
        mean_cong = mean(reaction_time[metadata == "congruent_1" | metadata == "congruent_2"]),
        sd_cong = sd(reaction_time[metadata == "incongruent_1" | metadata == "incongruent_2"])
        ) %>%
    dplyr::mutate(
        new_var = mean_cong/sd_cong
        )

【讨论】:

    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多