我在编写的脚本中遇到错误,只有在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
导致此错误,我该如何解决?
答案 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]))