我有一个包含不同组,年份及其值的数据框,例如:
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按组和年份来完成它吗?
答案 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以前没用过,看起来非常有用。我的替代方案,但类似的解决方案,基于dplyr
和broom
个包。
不同之处在于(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