使用dplyr

时间:2017-01-06 23:27:41

标签: r dplyr

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

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

或者说,我希望从2013年到2014年看到var2的差异,我希望以下数据框:

# 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中的加权平均移动等等。这些只是一些例子。我正在研究查询。

2 个答案:

答案 0 :(得分:2)

您几乎已经列出了您需要做的事情,但如果您想要保存列,请按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

如果您有两年以上或缺少数据,则可能需要更强大的方法。

答案 1 :(得分:0)

我们可以使用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