编写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,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次即可将所有平均地球化学数据平均化?

我是否需要分解函数的不同操作才能实现此目的?

我可以在其他数据框列表中应用此功能吗?

编辑:意识到我有多余的数据和我应该提到的两个单独的函数,它们实际上对不同分辨率的数据集执行相同的操作

wangzeaini 回答:编写R函数,但是如何修改它以遍历数据框中的列并遍历多个数据集?

如果将所有数据帧都放在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
}
本文链接:https://www.f2er.com/3133705.html

大家都在问