我的数据框看起来像这样:
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
中的加权平均移动等等。这些只是一些例子。我正在研究查询。
答案 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