动态选择所有列,但从以某个单词开头的列中排除所有列,但保留一个

时间:2018-10-12 09:23:13

标签: r dplyr subset plyr

我有许多格式的数据帧:

df1 <- structure(list(ID = 1:2, Name = 1:2, Gender = 1:2, Group = 1:2, 
                      FORMULA_RULE = 1:2, FORMULA_TRANSFORM = 1:2, FORMULA_UNITE = 1:2, 
                      FORMULA_CALCULATE = 1:2, FORMULA_JOIN = 1:2), class = "data.frame", row.names = c(NA, 
                                                                                                        -2L))

df2 <- structure(list(ID = 1:2, Name = 1:2, Gender = 1:2, FORMULA_RULE = 1:2, 
    FORMULA_META = c(NA, NA), FORMULA_DATA = 1:2, FORMULA_JOIN = 1:2, 
    FORMULA_TRANSFORM = 1:2, Group = 1:2), class = "data.frame", row.names = c(NA, 
-2L))

查看:

df1
  ID Name Gender Group FORMULA_RULE FORMULA_TRANSFORM FORMULA_UNITE FORMULA_CALCULATE FORMULA_JOIN
1  1    1      1     1            1                 1             1                 1            1
2  2    2      2     2            2                 2             2                 2            2

df2
  ID Name Gender FORMULA_RULE FORMULA_META FORMULA_DATA FORMULA_JOIN FORMULA_TRANSFORM Group
1  1    1      1            1           NA            1            1                 1     1
2  2    2      2            2           NA            2            2                 2     2

我想编写一种在所有此类数据帧上都可以保留所有列的方式编写的代码,但是在以FORMULA_开头的列中,仅选择了FORMULA_TRANSFORM。请注意,FORMULA_开头的列总是不相同的,也就是说,我不能简单地编写始终选择{{ 1}},IDNameGenderGroup,因为有些数据框包含许多其他不以FORMULA_TRANSFORM开头的列我想保留。

我要尝试解决此问题的 是这个丑陋的代码,它可以按预期起作用

FORMULA_

还有更简单的方法吗?

1 个答案:

答案 0 :(得分:2)

使用dplyr,我们可以使用select,使用starts_withcontains非常简单。

library(dplyr)
df1 %>%
   select(-starts_with("FORMULA_"), contains("FORMULA_TRANSFORM"))


#  ID Name Gender Group FORMULA_TRANSFORM
#1  1    1      1     1                 1
#2  2    2      2     2                 2

让我们尝试一个没有“ FORMULA_TRANSFORM”列的数据框

df3 <- df1
df3$FORMULA_TRANSFORM <- NULL

df3 %>%
   select(-starts_with("FORMULA_"), contains("FORMULA_TRANSFORM"))

#  ID Name Gender Group
#1  1    1      1     1
#2  2    2      2     2

带有减号的我们将删除starts_with“ FORMULA_”的列,并选择带有“ FORMULA_TRANSFORM”的列。除了contains以外,我们还可以使用one_of()matches(),它仍然可以使用。


使用基数R,我们可以将grepinvert设置为value的{​​{1}}

TRUE

这将创建一个列名向量,其中列名不以“ FORMULA_”开头,我们稍后会手动添加“ FORMULA_TRANSFORM”。

以上方法假定您的数据框中始终有“ FORMULA_TRANSFORM”列,如果没有,它将失败。更安全的选择是

df1[c(grep("^FORMULA_", names(df1), invert = TRUE, value = TRUE),
                                           "FORMULA_TRANSFORM")]

#  ID Name Gender Group FORMULA_TRANSFORM
#1  1    1      1     1                 1
#2  2    2      2     2                 2