在 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])))
可能是个简单的问题。
我是 运行 一个 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])))