У меня есть много фреймов данных, которые имеют такой формат:
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_
, не всегда одинаковы, то есть я не могу просто написать код, который всегда выбирает ID
, Name
, Gender
, Group
и FORMULA_TRANSFORM
, потому что есть некоторые фреймы данных, которые содержат много других столбцов, которые не начинаются с FORMULA_
, которые я хочу сохранить.
My попытка решить эту проблему - это уродливый код, который работает , как и ожидалось:
library(tidyverse)
for(i in 1:length(ls(pattern = "df"))){
get(paste0("df", i)) %>%
select(-starts_with("FORMULA"),
(names(get(paste0("df", i))) %>% grep(pattern = "FORMULA", value = T))[!names(get(paste0("df", i))) %>% grep(pattern = "FORMULA", value = T) %in% "FORMULA_TRANSFORM"])
%>% print
}
Есть ли более прямой способ сделать это?