【问题标题】:R - infinite loop if for dropping columnsR - 如果用于删除列,则无限循环
【发布时间】:2015-08-01 09:42:23
【问题描述】:

我正在尝试从数据框中删除无用的列。我使用了一个带有 if 语句的 while 循环,它似乎永远不会离开 if 语句:

it = 1
while (it < ncol(testing))
{
  if ("drop" %in% CategOfData[it,])
   {testing[,it]<-NULL}
  else it = it + 1
}

if 循环只要不嵌套在 while 循环中就可以工作。

测试是我的包含 400 行和 12 列的数据框,

CategOfData 是一个 12 行 2 列的数据框,CategOfData 包含我的 df "testing" 的标题和它的类别,3 行包含单词 "drop"

我通过将 {testing[,it]

我不明白为什么它从不进入代码的 else 部分。这使得 while 循环无限,因为“它”永远不会增加

我会使用 for 循环,但 R 不同意,因为我正在删除列。

CategOfData 的类型:

   > CategOfData [1,]
              header              x 
         "PIERRE.MARIE"         "drop" 

和“测试”

 > head(testing[,1])
 [1] PIERRE-MARIE PIERRE-MARIE PIERRE-MARIE PIERRE-MARIE PIERRE-MARIE  PIERRE-MARIE
       Levels: LAURENNE PIERRE-MARIE

你能帮我找出问题所在吗?

我试过这个

    it = 1
    rem = ncol(testing)
    while (it < rem)
    {
      if ("drop" %in% CategOfData2[it,])
       {testing[,it]<-NULL
        CategOfData2 = CategOfData2[-it,]
        rem = rem - 1
     }
     it = it + 1
  }

它可以工作〜好的,但不会删除最后一列是一个drop

【问题讨论】:

    标签: r loops if-statement while-loop


    【解决方案1】:

    你的问题可以用两行R代码解决:

    drop <- apply(CategOfData, 1, function(x) { "drop" %in% x })
    testing <- testing[, !drop]
    

    当你正确使用它时,这是 R 所拥有的那种力量的一个很好的例子。

    【讨论】:

    • 我试过了,它返回一个错误:“[&lt;-.data.frame(*tmp*, , drop, value = NULL) 中的错误:le tableau de remplacement a 0 éléments, et il en faut 1476”说replacement的dataframe有0个元素,需要1476个
    • 你可以自己执行drop &lt;- apply(CategOfData, 1, function(x) { "drop" %in% x })吗?如果是这样,那么drop 在您的控制台中包含什么?
    • 是的,我可以,它返回一串逻辑值:“[1] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE”
    • 更新了我的答案。您不需要使用NULL 来删除列,您可以简单地对testing 数据框进行子集化。这应该适合你了。
    • 再次更新。我否定了drop 向量。
    猜你喜欢
    • 2021-05-13
    • 2013-05-31
    • 1970-01-01
    • 2016-05-24
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多