【问题标题】:Positive and negative subsetting using dplyr::contains() and dplyr::select() in R在 R 中使用 dplyr::contains() 和 dplyr::select() 进行正子集和负子集
【发布时间】:2017-10-01 18:35:38
【问题描述】:

我正在尝试使用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"))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    想想(并查看生成的data.frame)之后会发生什么:df1 %&gt;% select(contains("ppt_"))。如要求,它只保留包含"ppt_"only 列。进一步的表达式无法按您的预期工作,因为其他列,无论您提供什么 select,都“不再”在那里。

    你可以保持相同的想法,但结合在同一个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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 2015-10-20
      • 2014-08-10
      • 2017-10-15
      • 2015-07-21
      相关资源
      最近更新 更多