如何迭代数据框中的列值,取平均值,并创建新的数据框?

时间:2016-07-12 09:02:04

标签: r loops dataframe mean

我在R中有一个大型数据框,我想绘制温度随时间的变化。我以前尝试过这个,但由于数据太多,图表真的很吵,无法阅读。

我尝试了其他情节类型试图解决这个问题,但他们并没有真正发挥作用。所以我决定将每小时绘制平均温度。

我已经从csv文件上传了数据,大约有56k行,一小时约720行给或拿。

> head(wormData)
 Time     Date Day.of.Week Humidity.1 Temp.1 Vapor.Density.1 Base.Temp.1
1 0:18:44 1/7/2016      Friday       69.7   26.4           17.43       85.00
2 0:18:49 1/7/2016      Friday       69.7   26.4           17.43       27.44
3 0:18:54 1/7/2016      Friday       69.6   26.4           17.40       27.44
4 0:18:59 1/7/2016      Friday       69.6   26.4           17.40       27.44
5 0:19:05 1/7/2016      Friday       69.5   26.4           17.38       27.44
6 0:19:10 1/7/2016      Friday       69.5   26.4           17.38       27.44

我感兴趣的专栏是Temp.1所以我想要做的是取Temp.1列中每720个值的平均值,然后将每个平均值放入一个新的数据帧中,这样我就可以绘制一个清洁图。

我想只是手工完成,但这将是大约50个数据点,我还有更多的csv文件要做,所以任何有关我如何做到这一点的帮助将不胜感激。我尝试过对数据进行子集化或使用平均值制作向量以及编写一些循环,但是我很难告诉R我想要每720行的平均值。

非常感谢:)

3 个答案:

答案 0 :(得分:0)

这是一个dplyr的解决方案,假设您的行号是720的倍数。我们创建一个分组变量,然后按组计算均值。

library(dplyr)
n <- 2 # replace with n <- 720 with your actual data
mutate(d,group = rep(1:(nrow(d)/n), each=n)) %>% 
  group_by(group) %>% 
  summarize(mean=mean(Temp.1))

数据

d <- read.table(text = " Time     Date Day.of.Week Humidity.1 Temp.1 Vapor.Density.1 Base.Temp.1
1 0:18:44 1/7/2016      Friday       69.7   26.4           17.43       85.00
2 0:18:49 1/7/2016      Friday       69.7   26.4           17.43       27.44
3 0:18:54 1/7/2016      Friday       69.6   26.4           17.40       27.44
4 0:18:59 1/7/2016      Friday       69.6   26.4           17.40       27.44
5 0:19:05 1/7/2016      Friday       69.5   26.4           17.38       27.44
6 0:19:10 1/7/2016      Friday       69.5   26.4           17.38       27.44",stringsAsFactor=FALSE,head=TRUE)

答案 1 :(得分:0)

matrix之上的一种基本解决方案:

 set.seed(123)
 x<-sample(1:10,(720*5),replace=TRUE) # generate dummy data

 > str(x)
 int [1:3600] 3 8 5 9 10 1 6 9 6 5 ...

 # Use wormData$Temp.1 instead of x for your actual datas  
 z<-matrix(x,nrow=length(x)/719) # divide by 719 to get 720 values per row
 rowMeans(z) # 'loop' over each row to get the mean

输出:

[1] 5.654167 5.375000 5.358333 5.477778 5.618056

如果您的数据集不是720的倍数,您将收到警告,最后一点将为false(回收矢量以填充最后一行)。

答案 2 :(得分:0)

以下是使用dplyr的更完整答案。这会使用您拥有的实际日期和时间,这样您每小时就不会接近720个值。

library(tidyverse)

worm_data <- data_frame(time = c("0:18:44","0:18:49","2:18:54",
                                 "0:18:59","0:19:05","2:19:10"),
                        date = c("2016-07-01","2016-07-01","2016-07-01", 
                                 "2016-07-02", "2016-07-02", "2016-07-02"),
                        temp_1 = c(25,27,290,30,20,2))

worm_data_test <- worm_data %>%
   mutate(
      date = paste(date, time),
      date = as.POSIXct(date, tz="GMT", format="%Y-%m-%d %H:%M:%S")
   ) %>%
   group_by(
      datetime = as.POSIXct(cut(date, breaks='hour')) # creates a new variable
   ) %>%
   summarize(
      temp_1 = mean(temp_1, na.rm=T)
   ) %>%
   ungroup()

在这种情况下,您按小时分组,然后总结那些小时。我选择了奇怪的值并修改了日期和时间以表明它有效。

有关日期时间的更多信息,建议您:https://www.stat.berkeley.edu/~s133/dates.html