在 sapply 函数中更新 data.frame

Update a data.frame within an sapply function

可能是个简单的问题。

我是 运行 一个 sapply 函数,除了该函数执行的其他操作外,我还想在其中更新 data.frame

我认为这个示例代码可以工作:

df <- NULL
res <- sapply(1:10, function(i){
  if(is.null(df)){
    df <- data.frame(itr=i,let = letters[i])
  } else{
    tmp.df <- data.frame(itr=i,let = letters[i])
    df <- rbind(df,tmp.df)
  }
  return(i)
})

实际上我 return 比索引 i 更复杂的东西。这只是一个简化的例子。

但是 df 在 运行 sapply 之后仍然为 NULL。

如何 df 更新?

在被赋值的函数中定义的 df 与在函数外定义的 df 不同 df。如果您将两次出现的 df <- 都替换为 df <<- 那么它将起作用。

虽然效率低下(因为连续追加到 R 中的对象是低效的)你可以像这样在循环中连续追加行:

df <- NULL 
for(i in 1:10) df <- rbind(df, data.frame(itr = i, let = letters[i]))

更好的方法是创建一个行列表,然后立即 rbind 它们:

do.call("rbind", lapply(1:10, function(i) data.frame(itr = i, let = letters[i])))