写一个R函数,但我如何修改它以在数据帧中的列上循环并在多个数据集上循环



我是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, agecolumn, variable1, 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, Month, Day, 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, variable ~ Year + Month, 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, key='Age', 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', var1name, varsum, 'Year', '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次函数来获得所有平均地球化学数据的平均值了?

我需要分解函数的不同操作才能实现这一点吗?

我可以在其他数据帧的列表中应用这个函数吗?

编辑:意识到我有无关的数据和两个我应该提到的独立函数,它们对不同分辨率的数据集基本上做了同样的事情

如果将所有数据帧放入list中,则应执行以下操作:

apply_all <- function(list_of_dfs){ # apply to all data frames
return(lapply(list_of_dfs, function(df) apply(df,2,YRMONTH)))) # apply to all columns of a data frame
}

最新更新