R 按Cut划分的数据组统计摘要

R 按Cut划分的数据组统计摘要,r,dplyr,grouping,cut,R,Dplyr,Grouping,Cut,我从多篇研究论文中获得了数百份关于不同年龄小动物体重的数据。我想对7天内的体重进行分组和年龄分析。我已经成功地使用了cut-in R按年龄对数据进行分组,并在每个7d存储箱中设置了默认值(计数)。但即使在谷歌搜索了很多次之后,我也找不到一种方法来扩展“削减”以获得每个年龄段的基本统计摘要,包括平均值、SE、CL和中位数。这可能吗?有人能帮我或给我指出正确的方向吗 我还研究了dplyr,虽然它似乎有能力提供统计摘要,但我看不到按7天间隔对年龄进行分组的方法。这是更好的选择吗 感谢非程序员提供的任何

我从多篇研究论文中获得了数百份关于不同年龄小动物体重的数据。我想对7天内的体重进行分组和年龄分析。我已经成功地使用了cut-in R按年龄对数据进行分组,并在每个7d存储箱中设置了默认值(计数)。但即使在谷歌搜索了很多次之后,我也找不到一种方法来扩展“削减”以获得每个年龄段的基本统计摘要,包括平均值、SE、CL和中位数。这可能吗?有人能帮我或给我指出正确的方向吗

我还研究了dplyr,虽然它似乎有能力提供统计摘要,但我看不到按7天间隔对年龄进行分组的方法。这是更好的选择吗

感谢非程序员提供的任何帮助

附加信息

谢谢你们两位的评论。很抱歉,我提供的信息有限,我希望这能澄清问题。我在Excel中有2000多行数据。行是以天为单位的年龄,列是“MaleFI”、“MaleMEI”和MaleBW,其中FI是食物摄入量,MEI是代谢能摄入量,BW是体重。数据的一部分如下所示。通常我可以用Excel数据透视表分析数据,但不包括计算中值或标准误差的选项;Power Pivot可以分组,但不能分组!因此,数据如下(按年龄排序,以天为单位,无空格):

  • 年龄男性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
年龄是连续的,可能高达900岁左右,每个年龄的值数量不同

目标是按7天周期分组,如我所述,对每组进行统计分析,因此:

  • 年龄MaleFI MaleMEI MaleBW
  • 21-28平均数
  • 硒硒
  • 中位数
  • 29-35平均数
  • 硒硒
  • 中位数
  • 36-42等
这是我用来对数据进行分组的代码,但正如我所提到的,事后看来,使用dplyr和group_by和summary可能是更好的方法

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)’的东西。