如何将数据帧划分为新的数据帧(如新数据 1、数据 2、数据 3 等),以便我可以对它们中的每一个进行分析(如 T 检验)

How to divide a data frame into new data frames(like new data1,data2,data3 ..so on), so I can anaylsis each of them(like T-test)

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

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

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

我是老外,可能语法错误比较多..但如果能帮到你,我将不胜感激!

假设您的数据在一个名为 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)
)

我们让物种 D 产生效果:

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

如果我们想在一个数据框上做,比如物种 A,我们会做

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

然后你会得到相关的统计数据等等。要对所有物种系统地执行此操作,我们可以使用扫帚,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)) 

这是一个从一个设置多个 data.frames 的例子。示例数据集 iris 是 3 个物种的 table 字符。

首先,您可以设置一个包含数据框中所有物种的向量 nspe。然后我创建一个相同长度的列表。

for 循环允许观察此列表中的每个元素,并把它放在 data.frame 中,只包含物种。

在这个脚本的最后,我计算了 setosa 物种的平均花瓣宽度。如果我在这个物种上有两个离散字符,我也可以做一个 t.test。我在这里做了一个,但它不是很有用...

data("iris")
summary(iris)

nspe <- as.vector(unique(iris$Species))

spe <- list() ; length(spe) = length(nspe) ; names(spe) <- nspe

for(i in nspe){
  spe[i][[1]] <- iris[which(iris$Species == i),]
}

mean(spe$setosa$Petal.Width)
# [1] 0.246
t.test(spe$setosa$Petal.Width)

下面的示例展示了如何对一个物种 运行 t.test。请注意,您肯定会遇到物种名称和空格的问题,因此我认为为物种设置 ID 比保留其全名更容易。

在以后的问题中,考虑提供一个小的示例数据集而不是图片,它更容易帮助你。

# NOT RUN
t.test(
  spe$Sorex_gracilliums$BW[which(spe$Sorex_gracilliums$SEX == 'm')],
  spe$Sorex_gracilliums$BW[which(spe$Sorex_gracilliums$SEX == 'f')]
)