在下面的脚本中,我希望用文件名和不同的值填充数据框,但我总是得到相同的值,我该如何解决?
脚本:
folder <- "E:/Testry"
i<-0;
k<-10;
for(filename in (paste0(folder,'/',list.files(folder))))
{
print(filename)
k<-sin(k);
i<-cos(i);
mydata <- data.frame(i,k, list.files(folder))
i<-i+1;
k<-k-1;
}
答案 0 :(得分:2)
尝试在循环之前创建一个空的data.frame:
mydata <- data.frame(numeric(0), numeric(0), character(0))
然后在循环中添加行:
mydata <- rbind(mydata, data.frame(i, k, filename))
它不是最有效的方法,但应该有效。如果您需要更高的效率,请在data.frame中预分配空间,并将rbind替换为预分配行的赋值。
答案 1 :(得分:2)
您也可以在没有循环的情况下执行此操作:
files <- list.files( folder )
i <- cos( seq.int( from = 0, by = 1, length.out = length(files) ) )
k <- sin( seq.int( from = 10, by = -1, length.out = length(files) ) )
mydata <- data.frame( "V1" = i, "V2" = k, "V3" = files )
因此,我们为您需要的每个列创建一个向量,然后将其插入到全新的数据框中。我不是100%反对for
循环,但R在这种方式下往往更有效率。
希望seq.int
调用是有意义的,如果没有看到帮助页面,它是一个非常方便的工具。
i
和k
两次,但这看起来像是你错误地完成的事情,因此我没有考虑到这一点这里。这是故意的吗?您希望i
和k
在循环的每次运行中换1,还是由sin
和cos
函数的结果确定的数量?
好的,既然你想让i和k值改变两次,这是另一种方式:
new <- data.frame( files = list.files( folder ), i = NA, k = NA )
new$i[1] <- cos(0)
new$k[1] <- sin(10)
for( row in 2:nrow(new)){
new$i[row] <- cos(new$i[row-1]+1)
new$k[row] <- sin(new$k[row-1]-1)
}
请注意,在for
循环中,每个[row]
取决于[row-1]
<div class="box-body">
<form action='myaction' method="post" name="form_dirc" enctype="multipart/form-data">
<p id="img_valid"></p>
<input type="file" id="files" class="" name="files[]" multiple="multiple" /><br>
<button type="submit" class=" btn btn-success" style="margin-left:14px;"><b>Upload<b></button>
</form>
</div>