代码之家  ›  专栏  ›  技术社区  ›  LLL

一元运算符的参数无效-错误消息-dplyr::select with vector为负

  •  1
  • LLL  · 技术社区  · 7 年前

    我一直在使用一个向量对一个数据帧进行正子集,它工作得很好现在我想使用相同的向量来对数据帧进行负子集。

    我收到一条错误消息(一元运算符的参数无效),但在谷歌搜索之后,我仍然不明白这是什么意思。

    谢谢你的帮助!

    # Starting point 
    df_main <- data.frame(coat=c(1:5),hanger=c(1:5),book=c(1:5),dvd=c(1:5),bookcase=c(1:5),
                          clock=c(1:5),bottle=c(1:5),curtains=c(1:5),wall=c(1:5))
    df_keep <- data.frame(keep_var=c("coat","hanger","book","wall","bottle"),othvar=c("r","w","r","w",NA))
    
    
    
    # Vector
    library(dplyr)
    keep.vec <- as.character(
      (df_keep %>% dplyr::filter(is.na(othvar) | othvar == 'r'))$keep_var
    )
    
    
    # Attempts at using vector for negative subsetting 
    df_main %>% dplyr::select(-keep.vec)
    df_main[-keep.vec, ] 
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   akrun    7 年前

    我们可以用helper函数包装它 one_of 在里面 tidyselect

    df_main %>%
        select(-one_of(keep.vec))
    #  hanger dvd bookcase clock curtains wall
    #1      1   1        1     1        1    1
    #2      2   2        2     2        2    2
    #3      3   3        3     3        3    3
    #4      4   4        4     4        4    4
    #5      5   5        5     5        5    5
    

    或者另一个选择是 setdiff

    df_main %>%
        select(setdiff(names(.), keep.vec))
    

    也可以在 tidyverse

    df_main[setdiff(names(df_main), keep.vec)]