r - 删除 R 中的多列时出错

标签 r for-loop runtime-error

我是 R 新手,我正在尝试使用 for 循环简单地删除许多列

for (i in 15:ncol(DB)){
    BD[,i]<- NULL
}

但我不断收到此错误:

 Error in `[<-.data.frame`(`*tmp*`, , i, value = NULL) : 
 new columns would leave holes after existing columns 

有人可以解释为什么会这样吗? 谢谢

最佳答案

其他人已经展示了如何做您想做的事,我将重点介绍错误消息的含义以及您的方法不起作用的原因。

假设您的数据框有 20 列。通过循环的第一次迭代将删除第 15 列,并且在此过程中将移动第 15 列之后的所有列以填补空白,因此第 16 列现在位于第 15 列的位置,并且数据框现在有 19 列。

第二次迭代现在将删除第 16 列(最初是第 17 列)并将另一列移过来,这样现在就有 18 列。

第三次迭代将删除第 17 列(最初是第 19 列已移动两次)并将第 20 列向下移动到第 17 列,数据框现在有 17 列。

第 4 次迭代将尝试将 NULL 分配给第 18 列,该列不存在,但在现有列旁边,因此可能不会提示。

第 5 次迭代现在将尝试分配给第 19 列,但数据框中只剩下 17 列,这会留下一个间隙(没有第 18 列),因此会出现错误。

这可能不是您想要的结果,因为第 16 列和第 18 列仍在数据框中,只是位置不同。这是在循环中修改任何对象时需要小心的原因之一。对于简单的删除,其他答案显示了更好的方法。但是如果你想使用一个循环,因为你只是有条件地删除,那么它仍然是可能的,你只需要使用 ncol(DB):15 向后工作(从右到左,从高到低)。而不是 15:ncol(DB) .这从最后一列开始向下移动,这样任何移动的列都是已经测试和处理过的列。

关于r - 删除 R 中的多列时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24764892/

相关文章:

重新排序因子给出不同的结果,具体取决于加载的包

r - 按列合并这些列的不同值

Python Protocol Buffer "from google.protobuf.pyext import _message"- "ImportError: DLL load failed: The specified procedure could not be found"

Python:当函数检查变量是否> 0时,我的程序将重新启动

excel - ActiveX组件无法创建对象-429

r - 根据 r 中的年龄确定出生日期

使用 R 按标准将数据随机拆分为训练数据集和测试数据集

javascript for 循环提前退出

java - switch 语句中的 break 会终止 for 循环吗?

python - 如何分别绘制重复循环的结果?