R:使用dplyr

时间:2015-09-09 11:05:16

标签: r statistics dplyr

我有一个包含不同组,年份及其值的数据框,例如:

data <- data.frame(
  group = c(rep('A', 120), rep('B', 120)),
  year  = rep(c(rep('2013-2014', 40), rep('2014-2015', 40), rep('2015-2016', 40)), 2),
  value = rnorm(240)
)

对于每组中的每一年,我想进行t检验以查看这些值是否与前几年显着不同(我一直在使用函数t.test(x,y,var.equal = TRUE)这是一次性的)

我想返回一个数据帧和p值,或者最好使用gtools :: stars.pval()生成重要的星号。所以返回类似下面的内容

group year      significance
A     2013-2014 NA
A     2014-2015 **
A     2015-2016 ***
B     2013-2014 NA
B     2014-2015
B     2015-2016

在上述情况下,2014 - 2015年和2013 - 2014年间差异的p值为&#39; A&#39;在2015年至2015年和2014 - 2015年之间,A的差值在0.001和0.01之间,并且<0.001。没有证据表明B在任何年份都有任何显着差异。

无法保证每个组的年数相同。

这样做的最佳和最快捷方式是什么?我希望我可以使用dplyr和group_by按组和年份来完成它吗?

2 个答案:

答案 0 :(得分:8)

另一个选择是汇总数据框,将所有值作为列表存储在一个单元格中(是的,你可以这样做 - 数据框里面可以有嵌套列表!)

使用dplyr:

df=tbl_df(data)
df=arrange(df,group,year) %>% group_by(group,year) %>% summarise(values=list(value))
df=mutate(df,prev_values=lag(values))
df=group_by(df,group,year)
df=filter(df,!any(is.na(unlist(prev_values))))
df=mutate(df,p_value=t.test(unlist(values),unlist(prev_values),var.equal=TRUE)$p.value) %>% print

  group      year    values prev_values   p_value
1     A 2014-2015 <dbl[40]>   <dbl[40]> 0.7894477
2     A 2015-2016 <dbl[40]>   <dbl[40]> 0.2385581
3     B 2014-2015 <dbl[40]>   <dbl[40]> 0.3084138
4     B 2015-2016 <dbl[40]>   <dbl[40]> 0.2557849

答案 1 :(得分:2)

我真的很喜欢@MaksimGayduk的解决方案。尤其是&#34;技巧&#34;使用summarise(values=list(value))。 Haven以前没用过,看起来非常有用。我的替代方案,但类似的解决方案,基于dplyrbroom个包。

不同之处在于(a)我首先创建一个表格,其中包含感兴趣的t.tests的相应信息,然后我从最初的df数据框调用相应的值,以及(b)扫帚包将t.test输出中的所有信息作为数据框返回,您可以从中选择p.value或其他任何需要的信息。

set.seed(15)

df <- data.frame(
  group = c(rep('A', 120), rep('B', 120)),
  year  = rep(c(rep('2013-2014', 40), rep('2014-2015', 40), rep('2015-2016', 40)), 2),
  value = rnorm(240)
)


library(dplyr)
library(broom)

df %>% 
  select(group, year) %>%
  arrange(group,year) %>%
  distinct() %>%
  group_by(group) %>%
  mutate(lag_year = lag(year)) %>%
  filter(!is.na(lag_year)) %>%
  group_by(group, year, lag_year) %>%
  do(tidy(t.test(df$value[df$year==.$year & df$group==.$group], 
                 df$value[df$year==.$lag_year & df$group==.$group])))


# Source: local data frame [4 x 11]
# Groups: group, year, lag_year [4]
# 
# group      year  lag_year    estimate   estimate1   estimate2  statistic   p.value parameter   conf.low conf.high
# (fctr)    (fctr)    (fctr)       (dbl)       (dbl)       (dbl)      (dbl)     (dbl)     (dbl)      (dbl)     (dbl)
# 1      A 2014-2015 2013-2014 -0.14570115  0.04597952  0.19168066 -0.6752803 0.5016009  74.05084 -0.5756153 0.2842130
# 2      A 2015-2016 2014-2015 -0.02752882  0.01845069  0.04597952 -0.1162621 0.9077438  77.96192 -0.4989302 0.4438726
# 3      B 2014-2015 2013-2014  0.39565472  0.05703318 -0.33862155  1.5776920 0.1187303  77.10933 -0.1037022 0.8950116
# 4      B 2015-2016 2014-2015 -0.07423089 -0.01719771  0.05703318 -0.3048113 0.7613240  77.77704 -0.5590850 0.4106233