我正试图使用dplyr::select()和dplyr::achieve ()的组合来实现正子设置,目标是通过多个字符串匹配进行子集。
最小的工作示例:从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"))发布于 2017-10-01 18:53:46
想一想(并看看得到的data.frame)之后发生了什么:df1 %>% select(contains("ppt_"))。如前所述,它只保留了唯一包含"ppt_"的列。进一步的表达式不能像您预期的那样工作,因为其他列,无论您为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 21https://stackoverflow.com/questions/46515598
复制相似问题