循环中的data.frame - R.

时间:2016-07-02 10:54:34

标签: r

在下面的脚本中,我希望用文件名和不同的值填充数据框,但我总是得到相同的值,我该如何解决?

脚本:

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;
} 

2 个答案:

答案 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调用是有意义的,如果没有看到帮助页面,它是一个非常方便的工具。

编辑:我注意到你在for循环中每次重新分配ik两次,但这看起来像是你错误地完成的事情,因此我没有考虑到这一点这里。这是故意的吗?您希望ik在循环的每次运行中换1,还是由sincos函数的结果确定的数量?

好的,既然你想让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>