use*_*199 3 statistics r 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)
)
Run Code Online (Sandbox Code Playgroud)
对于每组中的每一年,我想进行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
Run Code Online (Sandbox Code Playgroud)
在上述情况中,2014 - 2015年和2013 - 2014年间"A"差异的p值介于0.001和0.01之间,2015 - 2015年和2014 - 2015年A差异的p值<0.001.B的任何年份都没有任何显着差异的证据.
无法保证每个组的年数相同.
这样做的最好和最快的方法是什么?我希望我能用dplyr和group_by按组和年份来做吗?
另一种选择是总结数据框,将所有值作为列表存储在一个单元格中(是的,你可以这样做 - 数据框内部可以有嵌套列表!)
使用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
Run Code Online (Sandbox Code Playgroud)