dplyr 无效的下标类型列表

6

我在编写脚本时遇到了一个错误,只有当我运行 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会导致这个错误,并且该如何解决?
2个回答

5
我认为MKR的回答是有效的解决方案。我会进一步阐述一下这个问题,并提供一些替代方案。 readxl库是tidyverse的一部分,使用read_excel函数可以返回一个特殊类型的数据框——tibble (tbl_df)。与基本的行为不同的是,它有打印和子集化方面的区别(请阅读这里)。

Tibbles还清晰地界定了[[[]:[总是返回另一个tibble,[[总是返回一个向量。不再需要使用drop = FALSE

所以你现在可以看到,你的examplelist[i, n]将返回一个tibble而不是长度为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 如果您不想使用 tibbles。


2

即使我没有加载dplyr,我也能看到这个问题。问题似乎出在使用examplelist项上。如果您打印examplelist[1, 2]的值,那么它是一个1x1维度的数据框。但是期望a、b、c和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 会改变这种行为,以及如何改变的呢? - Walker in the City

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接