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行,忽略所有其他值.我的问题是它在我尝试的各种值的函数内工作(用各种组合打开多个文件)而不是当我尝试返回数据帧时.请有人帮忙吗.非常感谢提前.
如果我理解正确,那么您正在尝试创建一个数据框,其中包含每个数据集的完整案例数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)
以上代码的解释.你必须将你的问题分解为几个步骤:
x <- idid您需要完整案例的数量.为了实现这一点,您必须首先阅读该文件.这完成了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.通过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)
范围将允许每次迭代创建一个数据帧,您可以将其附加到原始数据帧,而不会丢失第一次和最后一次之间的任何迭代。