从函数返回数据框

use*_*034 9 r function dataframe

我在函数中有以下代码

Myfunc<- function(directory, MyFiles, id = 1:332) {
# uncomment the 3 lines below for testing
#directory<-"local"
#id=c(2, 4)
#MyFiles<-c(f2.csv,f4.csv)
idd<-id

df2 <- data.frame()

for(i in 1:length(idd)) {
  EmptyVector <- read.csv(MyFiles[i])  
  comp_cases[i]<-sum(complete.cases(EmptyVector))
  print(comp_cases[[i]])
  id=idd[i]
  ret2=comp_cases[[i]]
  df2<-rbind(df2,data.frame(id,ret2))
 }
print(df2)
return(df2)
}
Run Code Online (Sandbox Code Playgroud)

当我尝试通过选择函数内部的代码并注释掉返回时在R中运行它时,这种方法有效.我从print语句中获得了一个很好的数据框:

> df2
 id ret2
1 2  994
2 4  7112
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试df2从函数返回数据帧时,它只返回第1行,忽略所有其他值.我的问题是它在我尝试的各种值的函数内工作(用各种组合打开多个文件)而不是当我尝试返回数据帧时.请有人帮忙吗.非常感谢提前.

Jaa*_*aap 9

如果我理解正确,那么您正在尝试创建一个数据框,其中包含每个数据集的完整案例数id.假设您的文件是具有您指定的id-number的名称(例如f2.csv),您可以按如下方式简化您的功能:

myfunc <- function(directory, id = 1:332) {
  y <- vector()
  for(i in 1:length(id)){
    x <- id
    y <- c(y, sum(complete.cases(
      read.csv(as.character(paste0(directory,"/","f",id[i],".csv"))))))
  }
  df <- data.frame(x, y)
  colnames(df) <- c("id","ret2")
  return(df)
}
Run Code Online (Sandbox Code Playgroud)

您可以像这样调用此函数:

myfunc("name-of-your-directory",25:87)
Run Code Online (Sandbox Code Playgroud)

以上代码的解释.你必须将你的问题分解为几个步骤:

  1. 你需要一个id的向量,这是由你完成的 x <- id
  2. 对于每个人,id您需要完整案例的数量.为了实现这一点,您必须首先阅读该文件.这完成了read.csv(as.character(paste0(directory,"/","f",id[i],".csv"))).要获取该文件的完整案例数,您必须将read.csv代码包装在内部sumcomplete.cases.
  3. 现在,您要将该数字添加到矢量中.因此,您需要一个空的vector(y <- vector()),您可以在其中添加步骤2中的完整个案的数量.这是通过将步骤2中的代码包装在内部来完成的y <- c(y, "code step 2").通过这个,您可以为id向量添加每个完整案例的数量y.
  4. 最后一步是将这两个向量组合成一个数据帧,df <- data.frame(x, y)并指定一些有意义的colnames.

通过y <- vector()在for循环中包含步骤1,2和3(除了部分),您可以迭代指定id的列表.y <- vector()必须在for循环之前创建空向量,以便for循环可以添加值y.


小智 5

通过更改范围实际上很容易解决这个问题。

问题是您最初将初始数据帧创建为局部变量,然后您只是换出行,因此您将只获得数据帧中的第一个和最后一个结果。

当我用 R 创建一个 for 循环并想将连续查询等的结果添加到某个初始数据帧时,我这样做:

function(<some_args>){ 
main_dataframe <<- do something to generate the first set of results from 
whatever you want to iterate, like 1:10, a given list, etc. and create the 
initial dataframe from the first iteration and use the global assignment 
('<<-'), not '<-' or '='

main_dataframe <<- do_something(whatever_you're_iterating_over[1])

for (i in 2:length(whatever_you're_iterating_over)) {
next_dataframe = do_something(whatever_you're_iterating_over[i])

main_dataframe <<- rbind(main_dataframe, next_dataframe)
    }
}
Run Code Online (Sandbox Code Playgroud)

范围将允许每次迭代创建一个数据帧,您可以将其附加到原始数据帧,而不会丢失第一次和最后一次之间的任何迭代。

  • 感谢您提到“&lt;&lt;-”全局赋值运算符。这对我的情况很有帮助 (2认同)