我有少量的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循环执行时我都会覆盖每次迭代,我认为*我需要使用索引来做一些事情。
答案 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))