【问题标题】:How to pass arguments depending on columns when using R dplyr's summarise_each( ) function使用 R dplyr 的 summarise_each() 函数时如何根据列传递参数
【发布时间】:2015-06-06 16:12:01
【问题描述】:

对于包含多个列的 data.frame,我计划计算每个列的数据百分比超出 [low, high] 范围。由于此类“低”和“高”值在各列中有所不同(在下面的代码段中计算为 pcts),当使用 summarise_each() 函数时,如何传递每列对应的“低”和“高”值?到目前为止,我只能输入示例中显示的固定值。

pct10 <- function(dbl){quantile(dbl, 0.1)}
pct90 <- function(dbl){quantile(dbl, 0.9)}

valid.fms <- headgaze %>%
          filter(tracking_status == "OK")

pcts <- valid.fms %>%
     summarise_each(funs(pct10, pct90),
             head_pitch, head_yaw, head_roll,
             gaze_x, gaze_y, gaze_z)

 extreme.rt <- function(dbl, low, high){
               length(dbl[dbl < low | dbl > high])/length(dbl)

  }

feats <- valid.fms %>%
      group_by(lab_session) %>%
      summarise_each(funs(extreme.rt(., -10.98332, 11.045)),
                head_pitch, head_yaw, head_roll)

【问题讨论】:

  • 您找到解决方案了吗?

标签: r arguments dplyr


【解决方案1】:

我认为不存在通用解决方案(因为您需要将类似列表的对象传递给summarise_each)。
但是对于您的情况,一些更改可能会有所帮助。首先标记超出范围,然后计数。您可以使用mutate_each 实现此目的:

is_beyond <- function(x) x < pct10(x) | x > pct90(x)
headgaze %>%
    filter(tracking_status == "OK") %>%
    mutate_each(
        funs(is_beyond)
        ,head_pitch, head_yaw, head_roll, gaze_x, gaze_y, gaze_z
    ) %>%
    group_by(lab_session) %>% # ! this comes *after* mutate
    summarise_each(funs(mean), head_pitch, head_yaw, head_roll, gaze_x, gaze_y, gaze_z)

【讨论】:

    猜你喜欢
    • 2019-11-28
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多