我有许多格式的数据帧:
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}},ID
,Name
,Gender
和Group
,因为有些数据框包含许多其他不以FORMULA_TRANSFORM
开头的列我想保留。
我要尝试解决此问题的 是这个丑陋的代码,它可以按预期起作用:
FORMULA_
还有更简单的方法吗?
答案 0 :(得分:2)
使用dplyr
,我们可以使用select
,使用starts_with
和contains
非常简单。
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,我们可以将grep
和invert
设置为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