如何将数据帧划分为新的数据帧(如新数据 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')]
)
我刚开始学习 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')]
)