For循环返回上一个结果

时间:2017-12-22 19:58:44

标签: r for-loop

我有少量的csv文件,每个文件包含两个带数值的列。我想编写一个for循环来读取文件,对列进行求和,并将每个csv的总和存储在一个数字向量中。这是我最接近的:

allfiles <- list.files()
for (i in seq(allfiles)) {
     total <- numeric()
     total[i] <- sum(subset(read.csv(allfiles[i]), select=Gift.1), subset(read.csv(allfiles[i]), select=Gift.2))
     total
}

我的结果是所有NA都保存了最后一个文件的值。我知道每次for循环执行时我都会覆盖每次迭代,我认为*我需要使用索引来做一些事情。

2 个答案:

答案 0 :(得分:3)

第一个问题是你没有预先分配total的正确长度(或正确追加)alldata <- sapply(allfiles, read.csv, simplify = FALSE) totals <- sapply(alldata, function(a) sum(subset(a, select=Gift.1), subset(a, select=Gift.2))) 。无论如何,我建议不要采用这种方法。

有几种方法可以做到这一点,但是R-onic(我的术语,基于pythonic ......我知道,它不能很好地流动)基于矢量/列表。

Gift.3

我经常喜欢这样,将“原始/未更改”的数据保存在一个列表中,然后重复从中提取。例如,如果文件很大并且阅读它们是非常重要的时间,那么如果您意识到您还需要sapply并按照自己的方式进行操作,那么您需要重新读取整个数据集。但是,使用我的方法,您只需更新第二个totals <- sapply(allfiles, function(fn) { x <- read.csv(fn) sum(subset(x, select=Gift.1), subset(x, select=Gift.2)) }) 以包含更改并重新运行已加载的数据。 (我的大多数理由都是基于不受信任的数据,通常未使用的部分或其他可能不适合您的因素。)

如果您真的想将代码缩减为单行,请执行以下操作:

lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, final int position, long l) {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);
                builder.setTitle("Olá, Marilene!");
                builder.setItems(MainActivity.this.Nomes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which) {
                            case 0:
                                isStoragePermissionGranted();
                                sendWhatsAppAudio(position);
                                return;
                            case 1:
                                propaganda();
                                return;
                            default:
                        }
                    }
                });
                builder.show();
                return true;
            }
        });

    }

答案 1 :(得分:1)

allfiles <- list.files()
total <- numeric()
for (i in seq(allfiles)) {
 total[i] <- sum(subset(read.csv(allfiles[i]), select=Gift.1), subset(read.csv(allfiles[i]), select=Gift.2))
}
 total

如果可能的话尝试并在手前提供已知长度,即total<-numeric(length(allfiles))