【问题标题】:R Error 'Subscript out of bounds' in if statement - explanation and code fix?如果语句中的R错误“下标越界” - 解释和代码修复?
【发布时间】:2018-11-12 21:35:06
【问题描述】:

我有一个包含七列的数据框 (Dataset_Events),其中两列是 eventInfo_ea 和 eventInfo_el。我想在 eventInfo_ea = 'add to cart' 的行中删除 eventInfo_el 的单元格值。请参阅下面的代码。

 Remove = function(Dataset_Events, eventInfo_ea, eventInfo_el){
  if(Dataset_Events[["eventInfo_ea"]]=="add to cart"){
    Dataset_Events[["eventInfo_el"]] <- NULL
  }
 }
 sapply(Dataset_Events, Remove)

不幸的是,R 给了我以下错误信息: “Dataset_Events[["eventInfo_ea"]] 中的错误:下标越界” 数据框的尺寸为 713478 x 7。 任何人都可以解释为什么以及如何解决它?

如果我只是简单地运行 if 条件本身,我会得到与 data.frame 长度相同的正确 TRUE/FALSE 回复

Dataset_Events[["eventInfo_ea"]]=="add to cart"

这里是两个相关列的示例数据集(两列都有类因子):

eventInfo_ea                                           eventInfo_el
1                click                                              thumbnail
2                click                                            description
3                click                                             hero image
4                click                                     open size dropdown
5                click                                             hero image
6                click                                             hero image
7                click                                             hero image
8                click                                            description
9                click                                     open size dropdown
10               click                                             hero image
11               click                                             hero image
12               click                                             hero image
13               click                                             hero image
14               click                                            description
15               click                                           open reviews
16               click                                             hero image
17               click                                           open reviews
18               click                                            description
19     add to wishlist                                             hero image
20               click                                             hero image
21               click                                             hero image
22         add to cart                                             hero image

【问题讨论】:

  • 欢迎来到 SO!一些事情:Remove() 有 3 个参数,但您只使用 Dataset_Events。您可以将函数内的代码简单地命名为Dataset_Events[ Dataset_Events["eventInfo_ea"]=="add to cart", ]["eventInfo_el"] &lt;- NULL,最后您希望将data.frame 中的列传递给sapply。最后,发布示例数据集总是有帮助的,它使人们更容易测试他们的解决方案并为您提供帮助。

标签: r


【解决方案1】:

试试这个:

Remove = function(Dataset_Events){
    ind = Dataset_Events[["eventInfo_ea"]] == "add to cart"
    Dataset_Events[["eventInfo_el"]][ind] = NA
    return (Dataset_Events)
    }
Remove(Dataset_Events)

我从你的函数中删除了第二个和第三个参数(你似乎没有使用它们?)。正如您所注意到的,Dataset_Events[["eventInfo_ea"]]=="add to cart" 为您提供了一个逻辑向量,因此应该使用它来索引您要设置为 NA 的行(我从 NULL 更改,因为这会产生问题)。

【讨论】:

  • 你确定这是正确的吗? sapply 不会将remove 应用于Dataset_Event 的列吗? Remove(Dataset_Events) 应该可以正常工作,对吧?
  • 是的,这种情况下不需要sapply。我不得不从 OP 复制该行
  • 谢谢,但不幸的是它似乎仍然不起作用。即使我现在没有收到错误消息,但我的数据框看起来完全一样。 eventInfo_el where eventInfo_ea = "add to cart" 的值还是和之前一样,不是NA
  • 我在函数中添加了return 语句。还有问题吗?如果是这样,您对sum(Dataset_Events[["eventInfo_ea"]] == "add to cart") 有什么好处?
  • return 语句有助于在控制台中获取正确的数据集,但实际数据集没有改变。不过我发现出了什么问题。我用“Dataset_Events
【解决方案2】:

我认为问题在于Dataset_Events[["eventInfo_el"]] 返回一个因子。在这种情况下最好使用 identical

Remove = function(Dataset_Events, eventInfo_ea, eventInfo_el){
    if(identical(as.character(Dataset_Events[["eventInfo_ea"]]),"add to cart")){
        Dataset_Events[["eventInfo_el"]] <- NULL
    }
}
sapply(Dataset_Events, Remove)

【讨论】:

  • 我用 NA 而不是 NULL 和 sapply 和简单的 Remove(Dataset_Events) 尝试了这个,因为 sapply 给了我同样的“越界”错误。现在我没有收到错误消息,但在 Remove(Dataset_Events) 之后没有任何反应。在 eventInfo_ea == "add to cart" 的行中,eventInfo_el 的值没有变化。
  • 您能否给我们您的数据集或示例以使用代码对其进行测试?在我的和米奇的代码不起作用之后,如果没有例子就很难说......
  • 我在上面的问题中发布了数据集。或者是否有另一种实际上传文件的可能性?没看到过
【解决方案3】:

我实际上找到了一个可行的解决方案。我跳过了定义函数的整个部分,只使用了下面的代码,它就可以工作了

Dataset_Events[ Dataset_Events["eventInfo_ea"]=="add to cart", ]["eventInfo_el"] <- NA

仍然很高兴听到为什么你们所有人的建议似乎根本没有修改我的数据集。不过还是非常感谢!!!

【讨论】:

  • sapply 返回结果。不修改当前参数。每个申请都会这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多