【问题标题】:R Select n rows for each condition for each participantR为每个参与者的每个条件选择n行
【发布时间】:2018-08-14 14:51:19
【问题描述】:

我有这个关于多个单一研究的数据框。对三名参与者 (ID_AB2) 实施了行为干预,并收集了基线和干预条件的数据(阶段 AB2:A = 基线;B = 干预)。最后,“Occassions”是一个包含会话数的变量。

我试图做的是编写一个代码来获取每个参与者每个阶段的最后三个值,然后计算平均值。

 RateAB2 <- c(8, 4, 5, 5, 5, 4, 8, 7, 8, 5, 4, 8, 7, 4, 7, 7, 4, 3, 4, 4, 4, 5, 9, 6, 16, 13, 8, 9, 15, 17, 9, 10, 7, 3, 2, 4, 3, 3, 3, 7, 13, 18, 12, 18, 14, 17, 19, 15) %>% as.numeric()
 PhaseAB2 <- rep(c("A", "B"), each = 8, len = 48)
 OccasionsAB2 <- rep(1:16, len = 48)
 ID_AB2 <- rep(c("C1", "C2", "C3"), each = 16)
 db5 <- data.frame(ID_AB2, OccasionsAB2, PhaseAB2, RateAB2)

我正在考虑使用dbdplyr::filter(OccasionsAB2 == ...),但是代码将严格依赖于每个特定的数据集,并且它无法为具有不同观察次数的参与者选择不同的位置。

感谢您的帮助!

【问题讨论】:

    标签: r filter dplyr


    【解决方案1】:
    library(dplyr)
    
    RateAB2 <- c(8, 4, 5, 5, 5, 4, 8, 7, 8, 5, 4, 
                 8, 7, 4, 7, 7, 4, 3, 4, 4, 4, 5, 
                 9, 6, 16, 13, 8, 9, 15, 17, 9, 
                 10, 7, 3, 2, 4, 3, 3, 3, 7, 13, 
                 18, 12, 18, 14, 17, 19, 15) %>% 
                    as.numeric()
    PhaseAB2 <- rep(c("A", "B"), each = 8, len = 48)
    OccasionsAB2 <- rep(1:16, len = 48)
    ID_AB2 <- rep(c("C1", "C2", "C3"), each = 16)
    db5 <- data.frame(ID_AB2, OccasionsAB2, PhaseAB2, RateAB2)
    
    db5 %>%
      group_by(ID_AB2, PhaseAB2) %>%       # for each ID and Phase
      top_n(3, OccasionsAB2) %>%           # keep last 3 occasions
      summarise(MEAN = mean(RateAB2)) %>%  # get the average
      ungroup()                            # forget the grouping
    
    # # A tibble: 6 x 3
    #   ID_AB2 PhaseAB2  MEAN
    #   <fct>  <fct>    <dbl>
    # 1 C1     A         6.33
    # 2 C1     B         6   
    # 3 C2     A         6.67
    # 4 C2     B        12   
    # 5 C3     A         4.33
    # 6 C3     B        17 
    

    您可以将summarise 的过去更新为

    summarise(MEAN = mean(RateAB2), OccasionSequence = paste0(OccasionsAB2, collapse = ","))

    还可以获取每种情况下使用的场合的 ID(作为字符串)。

    【讨论】:

    • 这正是我想要的。谢谢!我只需要更改这部分,因为我需要每个条件的平均值:group_by(ID_AB2, PhaseAB2)
    • 不应该是top_n(-3...吗?
    • 不,因为它是 TOP 并且总是按降序排列。 -3 将为您提供最小的数字。检查?top_n where is 说“如果 n 为正,则选择前 n 行。如果为负,则选择后 n 行。”
    • 上面的top_n()等价于arrange(desc(OccasionsAB2)) %&gt;% slice(1:3)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2023-04-02
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多