dplyr无效的下标类型列表

时间:2017-12-08 22:00:48

标签: r dplyr

我在编写的脚本中遇到错误,只有在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 个答案:

答案 0 :(得分:4)

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

readxl库是tidyverse的一部分,并返回带有函数tbl_df的tibble(read_excel)。这是一种特殊类型的数据框,与基本行为有所不同,特别是打印子集(阅读here)。

  

Tibbles还清楚地描绘了[[[[始终返回另一个元素,[[始终返回一个向量。不再有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如果您不想要小吃。

答案 1 :(得分:2)

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

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