我在函数中有以下代码
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)
}
当我尝试通过在函数中选择代码并注释掉返回值来在R中运行它时,此方法有效。我从print语句中得到了一个不错的数据框:
> df2
id ret2
1 2 994
2 4 7112
但是,当我尝试从该函数返回数据帧
df2
时,它仅返回第一行,而忽略了所有其他值。我的问题是,它在函数中适用于我尝试过的各种值(使用各种组合打开多个文件),而不是在尝试返回数据帧时起作用。有人可以帮忙吗?在此先多谢。
最佳答案
如果我对您的理解正确,则您正在尝试创建一个数据框,其中包含每个id
的完整案例数。假设您的文件是具有您指定的id编号的名称(例如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)
}
您可以这样调用此函数:
myfunc("name-of-your-directory",25:87)
以上代码的解释。您必须将问题分解为以下步骤:
x <- id
id
,您需要完整的案例数。为了做到这一点,您必须先阅读文件。这是通过read.csv(as.character(paste0(directory,"/","f",id[i],".csv")))
完成的。要获取该文件的完整案例数,您必须将read.csv
代码包装在sum
和complete.cases
中。 y <- vector()
),可以在其中添加第2步中完整案例的数量。这是通过将第2步中的代码包装在y <- c(y, "code step 2")
中来完成的。这样,您就可以将每个id
的完整案例数添加到矢量y
中。 df <- data.frame(x, y)
组合成一个数据帧,并分配一些有意义的colnames
。 通过在一个for循环中包含步骤1、2和3(
y <- vector()
部分除外),您可以遍历指定ID的列表。必须在for循环之前使用y <- vector()
创建空向量,以便for循环可以将值添加到y
。
关于从函数返回数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24212723/