【问题标题】:Find the mean of every 3 rows求每 3 行的平均值
【发布时间】:2019-05-07 15:13:53
【问题描述】:

这是我的数据框:https://gofile.io/?c=7WLqCD

看起来像这样:

head(testframe)

       Time         Station1  Station2  Station3  Station4
 01.01.2017 07:00      27         38         26         25
 01.01.2017 14:00      22         49         25         16
 01.01.2017 21:00      41         53         46         36
 02.01.2017 07:00      22         38         26         19
 02.01.2017 14:00      20         54         35         13
 02.01.2017 21:00      36         45         30         26

我想计算 Station 1 到 Station 4 每天的平均值,即第 1-3 行、第 4-6 行、第 7-9 行等等。

class (testframe$Station1)factor,我知道它必须是数字才能计算平均值。所以我试着像这样转换它:

testframe[,4] = as.numeric(as.character(testframe$Station4))

这不起作用。我缺少标记为 # 的值。我用NA代替了,但是Station 3和Station 4还是有问题。

这个计算平均值的代码也不起作用。它给了我错误的结果。

colMeans(matrix(testframe$Station1, nrow=3))

【问题讨论】:

  • 当你准备data.frame时你设置stringAsFactors = F ???
  • 不,我没有。最初它来自 csv 格式。我刚刚保存了数据框来为这个网站上传它。
  • @akrun 在此处发布相关的欺骗链接。

标签: r rows mean na missing-data


【解决方案1】:

编辑:在 OP 更改后: 与dplyr

df %>% 
 rename(Date=row.names) %>% 
   group_by(Date) %>% 
   summarise_at(vars(contains("S")),list(Mean=mean))
# A tibble: 2 x 5
  Date       Station1_Mean Station2_Mean Station3_Mean Station4_Mean
  <chr>              <dbl>         <dbl>         <dbl>         <dbl>
1 01.01.2017            30          46.7          32.3          25.7
2 02.01.2017            26          45.7          30.3          19.3

数据:

df<-read.table(text="       Time         Station1  Station2  Station3  Station4
 01.01.2017 07:00      27         38         26         25
               01.01.2017 14:00      22         49         25         16
               01.01.2017 21:00      41         53         46         36
               02.01.2017 07:00      22         38         26         19
               02.01.2017 14:00      20         54         35         13
               02.01.2017 21:00      36         45         30         26",header=T,
               as.is=T,fill=T,row.names = NULL)

原答案:(每第三行取平均值)

我们可以执行以下操作(我已过滤以删除非数字):

colMeans(df[seq(0,nrow(df),3),-c(1,2)])
Station1 Station2 Station3 Station4 
    38.5     49.0     38.0     31.0 

数据:

df<-structure(list(row.names = c("01.01.2017", "01.01.2017", "01.01.2017", 
"02.01.2017", "02.01.2017", "02.01.2017"), Time = c("07:00", 
"14:00", "21:00", "07:00", "14:00", "21:00"), Station1 = c(27L, 
22L, 41L, 22L, 20L, 36L), Station2 = c(38L, 49L, 53L, 38L, 54L, 
45L), Station3 = c(26L, 25L, 46L, 26L, 35L, 30L), Station4 = c(25L, 
16L, 36L, 19L, 13L, 26L)), class = "data.frame", row.names = c(NA, 
-6L))

【讨论】:

  • 谢谢!我想我解释错了我的问题!我想要第 1-3、4-6、7-9 行等的平均值......所以在我的例子中,这将是一天所有观察值的平均值。
  • 这是一种略有不同的方法。请编辑您的问题,将您的数据添加为dput(head(mydata,10))
  • @NelsonGon 在此处的转换应注意。虽然它没有完全回答 OP 的要求(3 行组),但鉴于 OP 给出的背景,它几乎肯定是更好的解决方法。
  • 对!谢谢,我将添加导致更改的原因。
【解决方案2】:

可能你需要这样的东西

library(dplyr)
df %>%
  group_by(group = gl(n()/3, 3)) %>%
  summarise_at(-1, mean, na.rm = TRUE)

#  group Station1 Station2 Station3 Station4
#  <fct>    <dbl>    <dbl>    <dbl>    <dbl>
#1  1         30     46.7     32.3     25.7
#2  2         26     45.7     30.3     19.3

【讨论】:

  • 不幸的是,我刚刚同时更新,但它们的方法略有不同。
  • @NelsonGon 没问题,至少我们可以验证我们的答案给出相同的值:)
  • 非常感谢!当我想找到每 24 行的平均值时,我必须改变什么? gl(n()/3, 3)) 是否意味着,将 3 行放在一起并将其划分为 3?我怎样才能找到每 24 行的最大值?
  • @Essi 获取每 24 行的平均值,df %&gt;% group_by(group = gl(n()/24, 24)) %&gt;% summarise_at(-1, mean, na.rm = TRUE)。你可以通过gl(12/3, 3) 来检查它是如何工作的。它创建了 4 个组,每个组的长度为 3。
  • @Essi 你可以使用rounddf %&gt;% group_by(group = gl(n()/3, 3)) %&gt;% summarise_at(-1, list(~round(mean(., na.rm = TRUE))))
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 2015-03-12
  • 2018-06-17
  • 1970-01-01
  • 2021-03-03
  • 2014-09-07
  • 2014-04-23
  • 1970-01-01
相关资源
最近更新 更多