dplyr中使用select函数出错

12

使用dplyr的select函数时,它无法正常工作并给出错误提示,指出我要选择的列名是未使用的参数。但是,如果我在函数调用前指定dplyr,例如s:"dplyr::select",那么它就可以正常工作:

这里是一个示例数据框:

 sampledf <- structure(list(CRN = c(5497L, 6515L, 7248L, 36956L, 37021L), 
        varA = structure(c(2L, 2L, 2L, 2L, 2L), .Label = c("A", 
        "B"), class = "factor"), varB = c(NA_integer_, NA_integer_, 
        NA_integer_, NA_integer_, NA_integer_), VarC = c(NA, NA, 
        NA, NA, 2L), varD = c(NA_integer_, NA_integer_, 
        NA_integer_, NA_integer_, NA_integer_), varE = c(1L, 1L, 4L, NA, NA)), .Names = c("CRN", 
        "varA", "varB", "varC", "varD", "varE"), row.names = c(NA, 5L), class = "data.frame")

这会产生错误:

 sample_error <- select(sampledf, varA)

在选择(sampledf,varA)中出现错误:未使用的参数(varA)

而这个是有效的:

 sample_working <- dplyr::select(sampledf, varA)

 version

版本信息
平台:x86_64-w64-mingw32
架构:x86_64
操作系统:mingw32
系统信息:x86_64, mingw32
状态:
主要版本号:3
次要版本号:4.0
发布年份:2017
发布月份:04
发布日期:21
SVN版本号:72570
编程语言:R
版本字符串:R version 3.4.0 (2017-04-21)
代号:You Stupid Darkness

以下是会话信息:

sessionInfo()
R版本3.4.0(2017-04-21) 平台:x86_64-w64-mingw32 / x64(64位) 运行在:Windows> = 8 x64(构建9200)
矩阵产品:默认设置
区域设置: [1] LC_COLLATE =英语_美国。1252 LC_CTYPE =英语_美国。1252 LC_MONETARY =英语_美国。1252 [4] LC_NUMERIC = C LC_TIME =英语_美国。1252
附加的基本包: [1]统计图形实用程序数据集方法基础
其他附加包: [1] readxl_1.0.0 bindrcpp_0.2 doBy_4.5-15 reshape2_1.4.2 ltm_1.0-0 polycor_0.7-9 msm_1.6.4 [8] MASS_7.3-47 glmnet_2.0-10 foreach_1.4.3 Matrix_1.2-9 caret_6.0-76 lattice_0.20-35 dplyr_0.7.2 [15] purrr_0.2.3 readr_1.1.1 tidyr_0.6.3 tibble_1.3.3 ggplot2_2.2.1 tidyverse_1.1.1 openxlsx_4.0.17
通过命名空间加载(而不是附加): [1] Rcpp_0.12.11 lubridate_1.6.0 mvtnorm_1.0-6 assertthat_0.2.0 psych_1.7.5 R6_2.2.2 [7] cellranger_1.1.0 plyr_1.8.4 MatrixModels_0.4-1 stats4_3.4.0 httr_1.3.1 rlang_0.1.1 [13] lazyeval_0.2.0 minqa_1.2.4 SparseM_1.77 car_2.1-4 nloptr_1.0.4 labeling_0.3 [19] splines_3.4.0 lme4_1.1-13 stringr_1.2.0 foreign_0.8-67 munsell_0.4.3 broom_0.4.2 [25] compiler_3.4.0 modelr_0.1.1 pkgconfig_2.0.1 mnormt_1.5-5 mgcv_1.8-17 nnet_7.3-12 [31] expm_0.999-2 codetools_0.2-15 ModelMetrics_1.1.0 grid_3.4.0 nlme_3.1-131 jsonlite_1.5 [37] gtable_0.2.0 magrittr_1.5 scales_0.4.1 stringi_1.1.5 xml2_1.1.1 iterators_1.0.8 [43] tools_3.4.0 forcats_0.2.0 glue_1.1.0 hms_0.3 survival_2.41-3 parallel_3.4.0 [49] pbkrtest_0.4-7 colorspace_1.3-2 rvest_0.3.2 bindr_0.1 haven_1.1.0 quantreg_5.33

1
我无法重现这个问题。可能是你覆盖了dplyr的select()函数,或者在dplyr之后加载了一个具有自己的select()函数的包,导致其优先级更高。运行conflicts(detail=TRUE)以查看函数被重复定义的位置。也许可以展示一下sessionInfo(),我们可以看到你加载了哪些其他的包。 - MrFlick
4
听起来像是 MASS::select 函数命名冲突的问题。在加载 MASS 库之后加载 dplyr 库可以解决这个问题。 - alistaire
sessionInfo()已按要求包含。 - pd441
包MASS确实有一个名为select的函数,正如建议的那样。然而,我并没有明确地安装它。我需要它做什么吗? - pd441
2
@stevezissou 安装不是问题,加载才是。如果您没有手动加载它,则似乎 ‹ltm› 包正在这样做。向其维护者投诉,或不要使用它( ltm 包还附加了其他两个包;呃)。 - Konrad Rudolph
2个回答

14

我也遇到过相同的问题,原因是与另一个包发生了名称冲突。请使用:dplyr::select 来指定该包。


1
这篇文章虽然有些陈旧,但是评论中提到的信息可以填充到实际答案中:
这个问题确实是由于与另一个包发生名称冲突造成的;99(.9?)% 的情况下,“罪魁祸首”会是 MASS 包,该包有一个(文档不太清晰的)select() 函数(用于提取岭回归的最佳惩罚参数)。
通常,为了诊断此问题,find("select") 将会找到搜索路径上实际上第一次找到 select 函数的位置。
可能的解决方案:
  • 在加载 dplyr(或 tidyverse)包之后避免加载 MASS 包。
  • 像 @EJAg 回答中那样,在调用函数时指定 dplyr::select()
  • 在全局工作空间中分配: select <- dplyr::select (也可以使用 conflicted 包)。

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