首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >summarize_at和细分分组变量

summarize_at和细分分组变量
EN

Stack Overflow用户
提问于 2018-05-24 09:37:49
回答 1查看 315关注 0票数 0

如何使用summarize_at实现这一目标?

数据:

代码语言:javascript
复制
library(dplyr)
set.seed(100)
test_df <- data.frame(var_name=c(rep(LETTERS[1:3],each=3),"C"),
                      group_name=c(1,1,0,0,1,0,1,1,1,1),
                      obs_1=rnorm(10),
                      obs_2=rnorm(10))

我想要达到的目标:

代码语言:javascript
复制
test_df %>%
  group_by(var_name) %>%
  summarise(delta_obs1 = median(obs_1[group_name==1])-median(obs_1[group_name==0]),
            delta_obs2 = median(obs_2[group_name==1])-median(obs_2[group_name==0]),
            n_group1   = length(which(group_name==0)),
            n_group0   = length(which(group_name==1)))

# A tibble: 3 x 5
  var_name delta_obs1 delta_obs2 n_group1 n_group0
    <fctr>      <dbl>      <dbl>    <int>    <int>
1        A -0.1064135  0.2947143        1        2
2        B -0.4857362 -0.2318824        2        1
3        C         NA         NA        0        4

但是,如果有许多列(如我真实的例子),这是相当混乱和乏味的。

我无法工作的summarize_at 版本:

代码语言:javascript
复制
fun_obs_median <-
  function(x) {
    median(x[.$group_name == 1]) - median(x[.$group_name == 0])
  }

test_df %>%
  group_by(var_name) %>%
  summarize_at(.vars = colnames(.)[3:4],
               .funs=fun_obs_median)

Error in summarise_impl(.data, dots) : Evaluation error: object '.' not found.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-24 11:26:41

这将有助于:

代码语言:javascript
复制
library(tidyverse)

set.seed(100)
test_df <- data.frame(var_name=c(rep(LETTERS[1:3],each=3),"C"),
                      group_name=c(1,1,0,0,1,0,1,1,1,1),
                      obs_1=rnorm(10),
                      obs_2=rnorm(10))

# function to calculate delta
delta_f = function(x) x[2]-x[1]

test_df %>%
  group_by(var_name, group_name) %>%                          # for each combination of var and group
  summarise_at(vars(matches("obs")), median) %>%              # get the median for all columns that match "obs"
  arrange(var_name, group_name) %>%                           # for each var get group == 0 in first row and group == 1 in second row
  summarise_at(vars(matches("obs")), funs(delta = delta_f))   # apply delta function

# # A tibble: 3 x 3
#   var_name obs_1_delta obs_2_delta
#   <fct>          <dbl>       <dbl>
# 1 A             -0.106       0.295
# 2 B             -0.486      -0.232
# 3 C             NA          NA 

看起来,arrange()部件是不必要的,因为分组会按照您想要的方式自动排序行。但是,保持这种状态是很好的,以防将来的行为因包更新而发生变化。

对于计数,您可以使用这个

代码语言:javascript
复制
test_df %>%
  mutate(group_name = paste0("n_group", group_name)) %>%
  count(var_name, group_name) %>%
  spread(group_name, n, fill = 0)

# # A tibble: 3 x 3
#   var_name n_group0 n_group1
#   <fct>       <dbl>    <dbl>
# 1 A               1        2
# 2 B               2        1
# 3 C               0        4

然后通过var_name连接这两个表。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50505939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档