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

在R中使用dplyr::contains()和dplyr::select()进行正子集和负子集设置

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

    我正试图通过以下组合实现正子集: dplyr::select() 和dplyr::contains()`,目标是通过多个字符串匹配进行子集。

    df1 做负子集,我生成 df2 正如所料。相反,当尝试对 df1 ,我生成 df3 (没有专栏)当我期待像这样的事情时 df4 . 谢谢你的帮助。

    df1 <- data.frame("ppt_paint"=c(45,98,23),"het_heating"=c(1,1,2) ,"orm_wood"=c("QQ","OA","BB"), "hours"=c(4,6,4), "distance"=c(23,65,21))
    df2 <- df1 %>% select(-contains("ppt_")) %>% select(-contains("het_")) %>% select(-contains("orm_"))
    df3 <- df1 %>% select(contains("ppt_")) %>% select(contains("het_")) %>% select(contains("orm_")) 
    df4 <- data.frame("ppt_paint"=c(45,98,23),"het_heating"=c(1,1,2) ,"orm_wood"=c("QQ","OA","BB"))
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Vincent Bonhomme    7 年前

    思考(并查看结果) data.frame )之后会发生什么: df1 %>% select(contains("ppt_")) . 如前所述,它只保留了 包含的列 "ppt_" select 有了,都“不再”了。

    结合 在同一个 选择

    df1 %>% select(matches("ppt_"), matches("het_"), matches("orm_"))
      ppt_paint het_heating orm_wood
    1        45           1       QQ
    2        98           1       OA
    3        23           2       BB
    

    或者,你可以用 matches ,它接受正则表达式:

    df1 %>% select(matches(c("ppt_|het_|orm_")))
      ppt_paint het_heating orm_wood
    1        45           1       QQ
    2        98           1       OA
    3        23           2       BB
    

    df1 %>% select(-matches("ppt_|het_|orm_"))
      hours distance
    1     4       23
    2     6       65
    3     4       21