R 按Cut划分的数据组统计摘要
我从多篇研究论文中获得了数百份关于不同年龄小动物体重的数据。我想对7天内的体重进行分组和年龄分析。我已经成功地使用了cut-in R按年龄对数据进行分组,并在每个7d存储箱中设置了默认值(计数)。但即使在谷歌搜索了很多次之后,我也找不到一种方法来扩展“削减”以获得每个年龄段的基本统计摘要,包括平均值、SE、CL和中位数。这可能吗?有人能帮我或给我指出正确的方向吗 我还研究了dplyr,虽然它似乎有能力提供统计摘要,但我看不到按7天间隔对年龄进行分组的方法。这是更好的选择吗 感谢非程序员提供的任何帮助 附加信息 谢谢你们两位的评论。很抱歉,我提供的信息有限,我希望这能澄清问题。我在Excel中有2000多行数据。行是以天为单位的年龄,列是“MaleFI”、“MaleMEI”和MaleBW,其中FI是食物摄入量,MEI是代谢能摄入量,BW是体重。数据的一部分如下所示。通常我可以用Excel数据透视表分析数据,但不包括计算中值或标准误差的选项;Power Pivot可以分组,但不能分组!因此,数据如下(按年龄排序,以天为单位,无空格):R 按Cut划分的数据组统计摘要,r,dplyr,grouping,cut,R,Dplyr,Grouping,Cut,我从多篇研究论文中获得了数百份关于不同年龄小动物体重的数据。我想对7天内的体重进行分组和年龄分析。我已经成功地使用了cut-in R按年龄对数据进行分组,并在每个7d存储箱中设置了默认值(计数)。但即使在谷歌搜索了很多次之后,我也找不到一种方法来扩展“削减”以获得每个年龄段的基本统计摘要,包括平均值、SE、CL和中位数。这可能吗?有人能帮我或给我指出正确的方向吗 我还研究了dplyr,虽然它似乎有能力提供统计摘要,但我看不到按7天间隔对年龄进行分组的方法。这是更好的选择吗 感谢非程序员提供的任何
- 年龄男性FI MaleMEI男性BW
- 28.00 14.62 212.66 121.68
- 28.00 13.82 201.03 112.15
- 28.00 13.82 201.03 112.15
- 29.00 15.12 220.31 125.14
- 年龄MaleFI MaleMEI MaleBW
- 21-28平均数
- 硒硒
- 中位数
- 29-35平均数
- 硒硒
- 中位数
- 36-42等
library("xlsx")
library("dplyr")
Pivot.data <- read.xlsx(file.choose(), 1) # read first sheet
pt<-cut(Pivot.data$Age, breaks=seq(21, 800, by=7))
table(pt)
库(“xlsx”)
图书馆(“dplyr”)
Pivot.data如果我理解正确(但请下次尝试包含一个可复制的示例),此代码应该:
library(tidyverse)
your_df %>%
# mutate(Age_cl = cut(Age, c(-Inf,30,60,Inf))) %>%
mutate(Age_cl = cut(Age, breaks=c(-Inf, seq(min(Age), max(Age), by=7), Inf), right = F)) %>%
group_by(Age_cl) %>%
summarise(
n=n(),
m=mean(Age, na.rm=T),
sd=sd(Age, na.rm=T),
max=max(Age, na.rm=T),
min=min(Age, na.rm=T)
)
您创建新列age\u cl
,它是cut
的结果,然后根据此新列进行分组,并对所有需要的摘要进行汇总(或者您可以根据需要再次进行变异
)
您还可以在
处使用
总结功能列表:
your_df %>%
mutate(Age_cl = cut(Age, c(-Inf,30,60,Inf))) %>%
group_by(Age_cl) %>%
summarise_at("Age", list(m=mean, sd=sd, max=max, min=min), na.rm=T)
请注意,其他参数将应用于所有函数,如na.rm
编辑:对于记录,似乎有一种方法可以使用summary
功能,但您必须将其结果转换为data.frame才能工作。与上面那样编写函数相比,这对于摘要来说可能不值得。以下是iris
数据集的示例:
iris %>%
mutate(Sepal.Length_cl = cut(Sepal.Length, c(-Inf,5,6,Inf))) %>%
group_by(Sepal.Length_cl) %>%
group_modify(~summary(.$Sepal.Length) %>% unclass %>% t %>% as.data.frame)
嗨,欢迎来到苏。为了让我们帮助您,您需要与我们共享一个可复制的示例:我们可以运行的代码,用于复制您的数据集和预期输出。在R中,您可以使用dput(head(your_df,20))
并将结果发布到您的问题中。我希望上面的编辑可以更清楚地显示需求。感谢您的努力,但还不是这样。您没有按照我的建议使用dput
,因此您的代码只能由您使用,这没有多大帮助。谢谢。我将尝试一下你的建议。我使用的原始代码完全按照你的建议,但与我的实际df名称。我收到以下错误:错误:列age\u cl
必须是长度1996(行数)或1,而不是13。1996与导入的Excel工作表中的数据行数相匹配。@GrahamTobin I将age
更正为age
,并对您的dput
输出起作用。再试一次:-)简直太棒了!我做了上述改变,但问题仍然存在。我收到一条错误消息,说Tidyverse正在使用旧版本的rlang更新“rlang”时产生了相同的错误消息。我手动删除了所有库(我应该只尝试rlang)。已安装最新版本的rlang软件包,然后是tidyverse软件包。代码运行得很好。我已经扩展了总结部分,包括MaleFI、MaleMEI、MaleBW和median。完美且值与Excel数据透视表匹配。我已经手动添加了我需要的部分年龄范围,这也很有效。还有一个问题。丹,我应该把当前的解决方案粘贴到原始问题上吗?我在别处没见过这样的东西。现在是金星!我可以手动粘贴年龄范围以计算I.e.c(21,28,35,42等),但使用为范围(21900)和间隔(7)设置最小值和最大值的代码要优雅得多。类似于‘breaks=seq(21800,by=7)’的东西。