我是R的新手,我编写了非常笨拙的函数以应用于地球化学数据集,以将数据插值到附近的日期,转换十进制日期,按年/月对地球化学数据进行整形和平均,然后将其全部吐出最后作为新的数据帧。但是,一次只能处理一列,每个数据集有2-10列数据之间的任何地方,而我有50多个数据集。这需要大量的复制和粘贴,而且我知道应该有更好的方法来进行复制,但是我几个月来一直尝试并未能取得成功。
我尝试阅读有关内容,但无法实现我在其他地方看到的任何循环。
这是我的数据集的一个示例:
Year SrCa MgCa BaCa
1958.00 8.98 4.29 4.77
1958.08 9.00 4.21 4.56
1958.17 9.02 4.16 4.39
...
以下是我编写的功能:
#Interpolates monthly or bimonthly data to dates for the 15th of every month
yrmonth_INTERP<-function(dataset,agecolumn,variable1,var1name){
X_in = dataset[[agecolumn]] #select X (Age) column
y_in = dataset[[variable1]] # select y (data) column
x_out <- seq.Date(as.Date("1920/01/15"),as.Date("2017/12/15"),by = "months") #create reference dates
x_out <- decimal_date(x_out) #reference dates to decimal dates
xy_int <- approx(x = X_in,y = y_in,xout = x_out) #interpolate data
xy_int <- signif(as.data.frame(xy_int,row.names = NULL),digits = 12)
xy_int <- na.omit(xy_int)
Age<-date_decimal(xy_int[[1]]) #convert decimal to date
Year<-year(Age)
Month<-month(Age)
Day<-day(Age)
var1<-xy_int[[2]] #pull out variable
newdata<-cbind.data.frame(Year,Month,Day,var1) #create dataframe
date1 <-paste(newdata$Year,newdata$Month,newdata$Day,sep="-") #put together separate time variables into date
date1 <- ymd(date1) #convert to date
data_months <- cbind(date1,newdata) #add date column to previous dateframe
colnames(data_months) = c('Age','Year','Months','Day',var1name) #name columns
return (data_months)
}
#Turns lots of data points into the average for every month
yrmonth_avg<-function(dataset,var1name,varsum){
Age<-date_decimal(dataset[[agecolumn]]) #convert decimal to date
Year<-year(Age)
Month<-month(Age)
Day<-day(Age)
var1<-dataset[[variable1]] #pull out data variable
newdata<-cbind.data.frame(Year,var1) #create dataframe of time and data
datamelt = melt(newdata,id = c('Year','Month','Day'))
datacast = dcast(datamelt,variable ~ Year + Month,mean) #wide cast/reshape data to row to get mean by year and month
datacast2 = dcast(datamelt,sum) #wide cast/reshape data to row to get mean by year and month
Var1Data = datacast[-1:0] #remove first column
Var1sum = datacast2[-1:0]
re_data = gather(Var1Data,key='Age',value = var1name) #reshape mean data to columns
re_data1 = gsub("_","-",re_data$Age) #pull out info to make date
re_data2 <- ymd(re_data1,truncated = 1) #create date
day(re_data2) <- 15
newColNames <- c("Year","Month")
newCols <- colsplit(re_data1,newColNames) #keep separated time period columns
re_sum = gather(Var1sum,value = 'Sum') #return sum data to columns
data_months <- cbind(re_data2,re_data[[2]],re_sum[[2]],newCols) #create dataframe
data_months[[4]] <- as.numeric(data_months[[4]])
data_months[[5]] <- as.numeric(data_months[[5]])
colnames(data_months) = c('Age',varsum,'Months')
return (data_months)
}
最后我得到的是:
Age SrCa Year Months
1958-01-15 8.989589 1958 1
1958-02-15 9.009619 1958 2
1958-03-15 9.035000 1958 3
...
我可以在其中放置某种循环以将该函数应用于数据框中的所有列,这样我不必运行2-10次即可将所有平均地球化学数据平均化?
我是否需要分解函数的不同操作才能实现此目的?
我可以在其他数据框列表中应用此功能吗?
编辑:意识到我有多余的数据和我应该提到的两个单独的函数,它们实际上对不同分辨率的数据集执行相同的操作