首页 > 解决方案 > 如何将数据框划分为新的数据框(如新数据1、数据2、数据3 ..等等),以便我可以分析它们中的每一个(如T检验)

问题描述

我刚刚开始学习 R 进行数据分析。这是我的问题。

在此处输入图像描述

我想分析不同物种中雄性和雌性之间的体重(BW)差异。(例如,在Sorex gracilliums中,雄性和雌性体重差异显着只是一个例子,我不知道答案。:))起初我想也许我可以先将它们按物种分成几组。(这确实可以在 Excel 中完成,但我的文件太多,我认为也许 R 更好)然后我可以使用一些简单的代码来测试性别差异。但我不知道如何划分它们,如何制作新的数据框..我尝试使用 group_split。它确实拆分了数据,但只是很多 tribble。如图片所示

在此处输入图像描述

我应该怎么办?或者也许有更好的方法来测试差异?

我是外国人,所以可能有很多语法错误..但如果你能帮助我,我将不胜感激!

标签: rdataframesplitt-test

解决方案


假设您的数据位于名为 df 的 data.frame 中,其中包含 NO、SPECIES、SEX、BW 列:

set.seed(100)
df = data.frame(NO=1:100,
SPECIES=sample(LETTERS[1:4],100,replace=TRUE),
SEX=sample(c("M","F"),100,replace=TRUE),
BW = rnorm(100,80,2)
)

我们让 Species D 产生效果:

df$BW[df$SPECIES=="D" & df$SEX=="M"] = df$BW[df$SPECIES=="D" & df$SEX=="M"] + 5

如果我们想在一个数据帧上做,比如 Species A,我们做

dat = subset(df,SPECIES=="A")
t.test(BW ~ SEX,data=dat)

你会得到相关的统计数据等等。为了对所有物种系统地执行此操作,我们可以使用 broom、dplyr:

library(dplyr)
library(broom)

df %>% group_by(SPECIES) %>% do(tidy(t.test(BW ~ SEX,data=.)))

# A tibble: 4 x 11
# Groups:   SPECIES [4]
  SPECIES estimate estimate1 estimate2 statistic p.value parameter conf.low
  <fct>      <dbl>     <dbl>     <dbl>     <dbl>   <dbl>     <dbl>    <dbl>
1 A          0.883      80.4      79.6     0.936 3.65e-1      14.2   -1.14 
2 B          0.259      80.2      79.9     0.377 7.12e-1      14.1   -1.21 
3 C          0.170      80.1      79.9     0.359 7.23e-1      25.3   -0.807
4 D         -5.55       79.7      85.2    -7.71  1.29e-7      21.4   -7.05 

如果您不想安装任何软件包,这将为您提供所有测试结果:

by(df, df$SPECIES, function(x)t.test(BW ~ SEX,data=x))

并将它们组合成一个data.frame:

func = function(x){ 
Nu=t.test(BW ~ SEX,data=x);
data.frame(estimate_1=Nu$estimate[1],estimate_2=Nu$estimate[2],p=Nu$p.value)} 
do.call(rbind,by(df, df$SPECIES,func)) 

推荐阅读