Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中通过数据帧列表循环创建数据帧_R_Loops_Dataframe - Fatal编程技术网

在R中通过数据帧列表循环创建数据帧

在R中通过数据帧列表循环创建数据帧,r,loops,dataframe,R,Loops,Dataframe,我有一个大数据集,它被组织为1044个数据帧的列表。每个数据帧都是一个配置文件,用于保存不同站点和时间的相同数据。我正在尝试创建一个数据帧来保存函数fitsObs的输出,但是我当前的代码只通过一个数据帧。有什么想法吗 i=1 start=1 for(i in 1:1044){ station1 <- surveyCTD$stations[[i]] df1 <- surveyCTD$data[[i]] date1 <- surveyCTD$dates[[i]]

我有一个大数据集,它被组织为1044个数据帧的列表。每个数据帧都是一个配置文件,用于保存不同站点和时间的相同数据。我正在尝试创建一个数据帧来保存函数fitsObs的输出,但是我当前的代码只通过一个数据帧。有什么想法吗

    i=1
start=1
for(i in 1:1044){
  station1 <- surveyCTD$stations[[i]]
  df1 <- surveyCTD$data[[i]]
  date1 <- surveyCTD$dates[[i]]

  fitObs <- fitTp2(-df1$depth, df1$temp)

  if(start==1){
    start=0
    dfout <- data.frame(
      date=date1
      ,station=station1
    )
    names(fitObs) <- paste0(names(fitObs),"o")
    dfout<-cbind(dfout, df1$temp, df1$depth)
    dfout <- cbind(dfout, fitObs)

  }
}
i=1
开始=1
(我在1:1044中){

station1从第一眼看,我会尝试两种方法来调试它。首先打印DF的头部以了解循环的行为,然后检查变量dfout的范围,看起来该变量是循环的局部变量


此外,循环外的i变量不会改变循环中的任何内容。

我已经创建了一个可复制的示例,对您提出的问题进行了最佳猜测。我还假设您能够调整此通用示例中的概念,以适应您自己的问题。如果您以后提供一个列表示例,会更容易

首先,我们创建一些可复制的数据

a <- c(10,20,30,40)
b <- c(5,10,15,20)
c <- c(20,25,30,35)
df1 <- data.frame(x=a+1,y=b+1,z=c+1)
df2 <- data.frame(x=a,y=b,z=c)
ls1 <- list(df1,df2)
因此,我们现在在一个列表中有两个数据帧。下面的代码应该可以遍历列表中每个数据帧中的列,并将mean()函数应用于列中的数据。您可以通过选择“1”而不是“2”将其更改为行

df <- do.call("rbind", lapply(ls1, function(x) apply(x,2,mean)))
as.data.frame(df)
print(df)
   x   y   z
1 26 13.5 28.5
2 25 12.5 27.5

df考虑构建一个通用函数,用i
Map
调用(包装到
mapply
,是apply系列的m多个元素迭代器成员),用fitObs输出构建数据帧列表。并将所有等长对象传递到
data.frame()
构造函数

然后在循环外部,运行
do.call
以获得最终的、单个附加的数据帧,该数据帧包含所有1044个较小的数据帧(假设每个数据帧保持完全相同的列数):

#广义函数

添加内容请提供您的列表示例。同时查看
do.call
lappy
df <- do.call("rbind", lapply(ls1, function(x) apply(x,2,mean)))
as.data.frame(df)
print(df)
   x   y   z
1 26 13.5 28.5
2 25 12.5 27.5
# GENERALIZED FUNCTION
add_fit_obs <- function(dt, st, df) {

   fitObs <- fitTp2(-df$depth, df$temp)
   names(fitObs) <- paste0(names(fitObs),"o")

   tmp <- data.frame(
       date = dt,
       station = st,
       depth = df1$depth,
       temp = df1$temp,
       fitObs      
    )

   return(tmp)
}

# LIST OF DATA FRAMES
df_list <- Map(add_fit_obs, surveyCTD$stations, surveyCTD$dates, surveyCTD$data) 
# EQUIVALENTLY:
# df_list <- mapply(add_fit_obs, surveyCTD$stations, surveyCTD$dates, surveyCTD$data, SIMPLIFY=FALSE)

# SINGLE DATAFRAME
master_df <- do.call(rbind, df_list)