我有几个数据帧,它们的名称如下plant1_wd_hly、plant2_wd_rly、plant3-wd_hly。。。。。。,他们每个人都有这样的数据:
time temp
1 2012-01-01 00:00:00 20
2 2012-01-01 01:00:00 21
3 2012-01-01 02:00:00 22
4 2012-01-01 03:00:00 23
5 2012-01-01 04:00:00 24
我需要将所有这些数据汇总到每日水平,并计算每日最大值、最小值。以下是生成这样的df:的代码
x=seq(
from=as.POSIXct("2012-1-1 0:00", tz="UTC"),
to=as.POSIXct("2012-1-3 23:00", tz="UTC"),
by="hour")
plant1_wd_hrly=data.frame("time"=x,"temp"=seq(20,length.out=length(x)))
plant1_wd_hrly$time=as.POSIXct(substr(plant1_wd_hrly$time,1,10))
plant2_wd_hrly=data.frame("time"=x,"temp"=seq(25,length.out=length(x)))
plant2_wd_hrly$time=as.POSIXct(substr(plant1_wd_hrly$time,1,10))
plant1_wd_hrly$temp[2:3]=NA
plant2_wd_hrly$temp[5:6]=NA
如果只有一个df,我通常使用dplyr包进行聚合:
plant1_hrly=plant1_wd_hrly %>% group_by(time) %>% summarise(
temp_avg = mean(temp,na.rm=TRUE),
temp_max = max(temp,na.rm=TRUE),
temp_min = min(temp,na.rm=TRUE))
但是,对于多个df,有什么更有效的方法可以做到这一点呢?我想做的第一件事是做一个for循环,我可以从R加载一个动态生成的变量名吗?这样我就可以循环通过不同的df,因为它们都有非常相似的名称?如果我想给动态生成的变量名赋值,我可以使用assign,但如何加载呢?
谢谢。
制作一个类似df名称的向量,例如:
df_names <- grep("plant", ls(), value = T)
如果没有其他变量名称包含"plant"。否则,您需要使用regex。或者手工采摘。
然后在正文中使用get()和assign()循环遍历名称。您将第一个变量的名称作为字符串,它从变量中获取值。第二个采用一个名称和一个值,并将该值分配给该名称。
for(df_n in df_names){
temp_data = get(df_n) %>% group_by(time) %>% summarise(
temp_avg = mean(temp,na.rm=TRUE),
temp_max = max(temp,na.rm=TRUE),
temp_min = min(temp,na.rm=TRUE))
assign(paste0(df_n, "_agr"), temp_data)
}