【问题标题】:dplyr invalid subscript type listdplyr 无效下标类型列表
【发布时间】:2017-12-08 22:00:47
【问题描述】:

我在编写的脚本中遇到了一个错误,该错误仅在我运行 dplyr 时发生。当我从dplyr 找到一个我想使用的函数时,我第一次遇到它,然后我安装并运行了这个包。这是我的错误示​​例:

首先,我从 excel 中读取了一个表,其中包含我将用作索引的列值:

library(readxl)
examplelist <- read_excel("example.xlsx")

文件内容为:

1   2   3   4
1   1   4   1
2   3   2   1
4   4   1   4

然后我建立一个数据框:

testdf = data.frame(1:12, 13:24, 25:36, 37:48)

然后我有一个循环调用一个函数,该函数使用examplelist 的值作为索引。

testfun <- function(df, a, b, c, d){
  value1 <- df[[a]]
  value2 <- df[[b]]
  value3 <- df[[c]]
  value4 <- df[[d]]
}

for (i in 1:nrow(examplelist)){
  testfun(testdf, examplelist[i, 1], examplelist[i, 2], 
      examplelist[i, 3], examplelist[i, 4])
}

当我在没有dplyr 的情况下运行这个脚本时,一切都很好,但是使用dplyr 它给了我错误:

 Error in .subset2(x, i, exact = exact) : invalid subscript type 'list' 

为什么dplyr 会导致此错误,我该如何解决?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我认为 MKR 的答案是一个有效的解决方案,我将详细说明 为什么 并提供一些替代方案。

    readxl 库是 tidyverse 的一部分,并返回一个带有函数 read_excel 的小标题 (tbl_df)。这是一种特殊类型的数据框,与基本行为有所不同,尤其是 printingsubsetting(请阅读 here)。

    Tibbles 还清楚地描述了[[[[ 总是返回另一个 tibble,[[ 总是返回一个向量。没有了drop = FALSE

    所以您现在可以看到您的 examplelist[i, n] 将返回一个小标题,而不是长度为 1 的向量,这就是使用 as.numeric 有效的原因。

    library(readxl)
    
    examplelist <- read_excel("example.xlsx")
    
    class(examplelist[1, 1])
    # [1] "tbl_df"     "tbl"        "data.frame"
    
    class(examplelist[[1, 1]])
    # [1] "numeric"
    
    class(as.numeric(examplelist[1, 1]))
    # [1] "numeric"
    
    class(as.data.frame(examplelist)[1, 1])
    # [1] "numeric"
    

    我的工作流程倾向于使用tidyverse,因此您可以使用[[ 子集或as.data.frame,如果您不想要小标题。

    【讨论】:

      【解决方案2】:

      即使没有加载dplyr,我也能看到这个问题。罪魁祸首似乎是使用了examplelist 项目。如果您打印 examplelist[1, 2] 的值,那么它是 1x1 维度的 data.frame。但是a, b, c and d 的值应该是一个简单的数字。因此,如果您使用as.numeric 更改examplelist[i, 1] 等,则将避免错误。将testfun的调用改为:

      testfun(testdf, as.numeric(examplelist[i, 1]), as.numeric(examplelist[i, 2]), 
                as.numeric(examplelist[i, 3]), as.numeric(examplelist[i, 4]))
      

      【讨论】:

      • 这行得通,但我仍然不明白为什么加载dplyr 会改变examplelist[1, 2] 的值(我现在已经检查了有无dplyr)。我希望在使用 [a, b] 对数据框进行子集时,它会简化结果(或者至少这是 Advanced R 告诉我的)。为什么加载 dplyr 会改变这种行为,以及如何改变?
      猜你喜欢
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 2015-11-01
      • 2018-05-22
      • 1970-01-01
      • 2015-03-18
      相关资源
      最近更新 更多