【问题标题】:Summarising longitudinal data with dplyr用 dplyr 总结纵向数据
【发布时间】:2017-01-06 23:27:40
【问题描述】:

我有一个看起来像这样的数据框:

set.seed(100)

library(dplyr)

df <- tibble(ID = rep(1:4, each = 2),
              weight = rep(abs(rnorm(4, 5, 3)), each = 2),
              year = rep(2013:2014, 4),
              var1 = sample(1:5, 8, rep = TRUE),
              var2 = sample(1:5, 8, rep = TRUE))

生成如下所示的数据:

# A tibble: 8 x 5
     ID   weight  year  var1  var2
  <int>    <dbl> <int> <int> <int>
1     1 3.493423  2013     3     2
2     1 3.493423  2014     1     2
3     2 5.394593  2013     4     2
4     2 5.394593  2014     5     4
5     3 4.763249  2013     2     3
6     3 4.763249  2014     2     4
7     4 7.660354  2013     4     3
8     4 7.660354  2014     4     4

我希望快速、简单地推断出事情从一年到下一年的变化。 ID 变量是我的纵向样本中每个人的唯一标识符。

我的想法是使用group_by(ID) 按他们的ID 对我的数据进行分组,然后也许以某种方式使用summarise 函数。我希望我们使用summarise 函数时看到的“折叠”效果。

例如,假设我想按人查看var1 在两年内是否保持不变。我们在上面看到这对于人 3 和 4 来说是正确的。我希望能够获得以下数据框:

# A tibble: 4 x 3
     ID   weight indicator
  <int>    <dbl>     <lgl>
1     1 3.493423     FALSE
2     2 5.394593     FALSE
3     3 4.763249      TRUE
4     4 7.660354      TRUE

或者,假设我想查看 var2 从 2013 年到 2014 年的差异,我需要以下数据框:

# A tibble: 4 x 3
     ID   weight diff_var2
  <int>    <dbl>     <dbl>
1     1 3.493423         0
2     2 5.394593         2
3     3 4.763249         1
4     4 7.660354         1

有没有人对如何解决这个问题有任何想法?我不知道这将如何推广到更多年的数据,但目前我只是在处理两年的纵向数据。

最后,例如,我想知道var1 不变的人的加权比例,或var2 中的加权平均移动等。这些只是我正在寻找的各种查询的一些示例进入。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您几乎已经列出了您需要做的事情,但如果您想保存列,请按 ID 和权重进行分组。

    df %>% group_by(ID, weight) %>% 
        summarise(indicator = n_distinct(var1) < n(), 
                  diff_var2 = diff(var2))
    
    ## Source: local data frame [4 x 4]
    ## Groups: ID [?]
    ## 
    ##      ID   weight indicator diff_var2
    ##   <int>    <dbl>     <lgl>     <int>
    ## 1     1 3.493423     FALSE         0
    ## 2     2 5.394593     FALSE         2
    ## 3     3 4.763249      TRUE         1
    ## 4     4 7.660354      TRUE         1
    

    如果您有超过两年的数据或缺失数据,您可能需要更稳健的方法。

    【讨论】:

    【解决方案2】:

    我们可以使用data.table

     library(data.table)
     setDT(df)[, .(indicator=uniqueN(var1)==1, diff_var2= diff(var2)), ID]
     #   ID indicator diff_var2
     #1:  1     FALSE         0
     #2:  2     FALSE         2
     #3:  3      TRUE         1
     #4:  4      TRUE         1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 2018-09-20
      • 2015-06-12
      • 2022-01-14
      相关资源
      最近更新 更多