使用R从平均值大于阈值的表中提取月度数据

使用R从平均值大于阈值的表中提取月度数据,r,list,R,List,我有两个表(a和b),每个表有365条记录(1年数据)。我想得到表a中每个月的平均值,如果它低于0.01,则删除属于该月的所有每日值,并输出一个新表。另外,我希望从表b中删除相应的每日值,并为其生成一个新表 例如:如果1月和4月的月平均值小于0.01,则输出表a和b,各有304个值。dput(头(a))和dput(头(b))的输出分别为: structure(list(V1 = c(0, 0, 0, 0.43, 0.24, 0)), .Names = "V1", row.names = c(NA

我有两个表(
a
b
),每个表有365条记录(1年数据)。我想得到表
a
中每个月的平均值,如果它低于0.01,则删除属于该月的所有每日值,并输出一个新表。另外,我希望从表
b
中删除相应的每日值,并为其生成一个新表

例如:如果1月和4月的月平均值小于0.01,则输出表
a
b
,各有304个值。
dput(头(a))
dput(头(b))
的输出分别为:

structure(list(V1 = c(0, 0, 0, 0.43, 0.24, 0)), .Names = "V1", row.names = c(NA, 6L), class = "data.frame")

structure(list(V1 = c(0.042022234, 0.014848409, 0.275174289, 0.485364883, 0.177960815, 0.006799459)), .Names = "V1", row.names = c(NA, 6L), class = "data.frame")

我不知道如何在R中使用列表理解。任何建议都将不胜感激。

这不是最优雅或最快捷的方法,但这里有一个想法:

a <- data.frame(Date=seq.Date(from = as.Date("2013-01-01"),to = as.Date("2013-12-31"),length.out = 365),a=rnorm(n = 365,mean = .01,sd = .1)) 
b <- data.frame(Date=seq.Date(from = as.Date("2013-01-01"),to = as.Date("2013-12-31"),length.out = 365),b=rnorm(n = 365,mean = .01,sd = .15)) 
require(dplyr)
c <- merge(a,b,by=1)
c <- tbl_df(data = c)
c <- mutate(c, month=substr(c$Date,6,7))
d <- summarise(group_by(c, month),am = mean(a),bm=mean(b))
c <- left_join(c,d)
c <- filter(c, c$am>=.01 & c$bm>= .01)
a <- c[,c(2,3)]
b <- c[,c(2,4)]
remove(c,d)

a单独使用基本函数,并假设您的两个数据帧具有变量
day
month
value

> new_a <- do.call(rbind, by(a, a$month, function(df) {
      ifelse(mean(df$value) < 0.01, NULL, df)
  }))
> new_b <- subset(b, day %in% new_a$day)

如果
table
表示data.frame和数据结构与@eclark的示例数据相似,则可以使用
dplyr
尝试类似的方法

数据

set.seed(123)
a <- data.frame(Date=seq.Date(from = as.Date("2013-01-01"),to = as.Date("2013-12-31"),
                length.out = 365), value=rnorm(n = 365,mean = .01,sd = .1))

b <- data.frame(Date=seq.Date(from = as.Date("2013-01-01"),to = as.Date("2013-12-31"),
                length.out = 365), value=rnorm(n = 365,mean = .01,sd = .15))
set.seed(123)
a b
#获取每个月的平均值,并获取数据框中平均值低于0.01的月份,a
总结(a组,月),平均值=平均值(值))%>%
过滤器(平均值<0.01)->wutever
#伍特弗
#来源:本地数据帧[5 x 2]
#
#月平均数
#1    01  0.0068172630
#2    04  0.0006111069
#3    05 -0.0052247522
#4    08  0.0008155293
#5    12  0.0054872409
#从a和b中删除数据点,包括wutever中的月份
筛选器(a,!月%(在%wutever$month中)->newA
过滤器(b,!月%(在%wutever$month中)->newB

您确实需要尝试一些东西,然后向我们展示您的尝试。2提示:
?“[”
?as.POSIXlt
是一个表a
数据框
,或者是一个
?或者它是一个
列表
,就像标签所建议的那样?请制作一个我有一个文本文件,并用
读取.表
编辑您的问题,以包括
dput(head(a))
dput(head(b))的输出
在数据框中,我只有一个保存值的变量。是否可以只使用值而不使用
变量?我很困惑…你怎么知道哪个值对应于哪一天?你可能需要澄清一下你的问题。我不知怎的能够将日期信息导出到下载的文件中但它的格式如下
19800101
。我需要日期格式将其转换为天,对吗?我有一列值,没有日期列作为数据的一部分frame@Ibe那个么你们在哪里有日期?@jazzuro:数据是通过从气象服务指定开始和结束日期下载的。但表中只包含该日期的值period@Ibe在这种情况下,您需要创建一个日期序列,并创建一个数据框/数据表,包括您拥有的日期和值。这可能与eclark在其答案中创建的内容类似。
set.seed(123)
a <- data.frame(Date=seq.Date(from = as.Date("2013-01-01"),to = as.Date("2013-12-31"),
                length.out = 365), value=rnorm(n = 365,mean = .01,sd = .1))

b <- data.frame(Date=seq.Date(from = as.Date("2013-01-01"),to = as.Date("2013-12-31"),
                length.out = 365), value=rnorm(n = 365,mean = .01,sd = .15))
library(dplyr)

# Create a column with month
mutate(a, month = as.character(format(Date, "%m"))) -> a
mutate(b, month = as.character(format(Date, "%m"))) -> b

# Get mean for each month and get months with average lower than 0.01 in the data frame, a
summarise(group_by(a, month), average = mean(value)) %>%
filter(average < 0.01) -> wutever

#wutever
#Source: local data frame [5 x 2]
#
#  month       average
#1    01  0.0068172630
#2    04  0.0006111069
#3    05 -0.0052247522
#4    08  0.0008155293
#5    12  0.0054872409

# Remove data points including months in wutever from a and b
filter(a, !month %in% wutever$month) -> newA
filter(b, !month %in% wutever$month) -> newB