繁体   English   中英

如何根据 R 中的分组变量来估计大量数据帧中同一列的平均值

[英]How to estimate means from same column in large number of dataframes, based upon a grouping variable in R

我在 R (>50) 中有大量 DF,它们对应于我执行的不同过滤,以下是其中 7 个的示例:

Steps_Day1 <- filter(PD2, Gait_Day == 1)
Steps_Day2 <- filter(PD2, Gait_Day == 2)
Steps_Day3 <- filter(PD2, Gait_Day == 3)
Steps_Day4 <- filter(PD2, Gait_Day == 4)
Steps_Day5 <- filter(PD2, Gait_Day == 5)
Steps_Day6 <- filter(PD2, Gait_Day == 6)
Steps_Day7 <- filter(PD2, Gait_Day == 7)

每个数据帧都包含 19 个变量,但是我只对它们的速度(计算平均值)和它们的主题 ID 感兴趣,因为每个主题在同一个 DF 中都有多个速度观察值。

我们感兴趣的数据示例,在 dataframe - Steps_Day1:

Speed     SubjectID
0.6          1
0.7          1
0.7          2
0.8          2
0.1          2
1.1          3
1.2          3
1.5          4
1.7          4
0.8          4

数据上升到 61 分。 并且每个参与者的观察次数远大于此。

现在我想做的是创建一个代码,该代码自动循环遍历 50 个数据帧中的每一个(以上面的 7 个为例)并计算每个参与者的平均速度并将其存储并保存在新的 dataframe 中,与变量一起包含其他 DF 中每个参与者的平均值。

第 1 天的步数示例(值不准确)

Speed     SubjectID
0.6          1
0.7          2
1.2          3
1.7          4

等等......在我最终得到一个包含列向量的最终 DF 之前,每个其他数据帧中的每个参与者的平均值可能看起来像:

Steps_Day1   StepsDay2   StepsDay3   StepsDay4   SubjectID
0.6             0.8           0.5         0.4          1                   
0.7             0.9           0.6         0.6          2   
1.2             1.1           0.4         0.7          3  
1.7             1.3           0.3         0.8          4  

我可以通过一些可怕的、凌乱的长代码来做到这一点——但请看看是否有人有更直观的想法!

:)

您没有包含数据集的 MCVE,因此我无法测试解决方案,但使用tidyverse解决方案似乎是一个非常简单的问题。

首先,为什么要将PD2拆分为单独的数据帧? 如果你跳过它,你可以使用 group 和 summarise 来获得组的平均值:

PD2 %>%
    group_by(Gait_Day, SubjectID) %>%
    summarize(Steps = mean(Speed))

这将为您提供一个带有 3 个变量的“长格式”data.frame: Gait_DaySubjectIDSteps ,它具有该主题和日期的平均速度。 如果您想要最后显示的格式,只需使用pivot_wider将 pivot 转换为“宽格式”。 您可以看到这个问题以进一步解释:如何将数据从长格式重塑为宽格式

要添加到先前的答案,我同意在不为每天创建新数据框的情况下执行此操作要容易得多。 使用一些生成的数据,您可以达到您想要的结果,如下所示:

# Generate some data
df <- data.frame(
  day = rep(1:5, 1, 100),
  subject = rep(5:10, 1, 100),
  speed = runif(500)
)

df %>%
  group_by(day, subject) %>%
  summarise(avg_speed = mean(speed)) %>%
  pivot_wider(names_from = day,
              names_prefix = "Steps_Day",
              values_from = avg_speed)

# A tibble: 6 × 6
  subject Steps_Day1 Steps_Day2 Steps_Day3 Steps_Day4 Steps_Day5
    <int>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>
1       5      0.605      0.416      0.502      0.516      0.517
2       6      0.592      0.458      0.625      0.531      0.460
3       7      0.475      0.396      0.586      0.517      0.449
4       8      0.430      0.435      0.489      0.512      0.548
5       9      0.512      0.645      0.509      0.484      0.566
6      10      0.530      0.453      0.545      0.497      0.460

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM