Как удалить столбцы по шаблону имен в R? - программирование
Подтвердить что ты не робот

Как удалить столбцы по шаблону имен в R?

У меня есть этот фреймворк:

state county city  region  mmatrix  X1 X2 X3    A1     A2     A3      B1     B2     B3      C1      C2      C3

  1      1     1      1     111010   1  0  0     2     20    200       Push      8     12      NA      NA      NA
  1      2     1      1     111010   1  0  0     4     NA    400       Shove      9     NA 

Теперь я хочу исключить столбцы, имена которых заканчиваются определенной строкой, например "1" (т.е. A1 и B1). Я написал этот код:

df_redacted <- df[, -grep("\\1$", colnames(df))]

Однако это, кажется, удаляет каждый столбец. Как я могу изменить код так, чтобы он удалял только столбцы, соответствующие шаблону (т.е. Заканчивается "3" или любой другой строкой)?

Решение должно иметь возможность обрабатывать фрейм данных с численными и категориальными значениями.

4b9b3361

Ответ 1

Ваш код работает как шарм, если я применил его к минимальному примеру и просто выполнил поиск строки "A":

df <- data.frame(ID = 1:10,
                 A1 = rnorm(10),
                 A2 = rnorm(10),
                 B1 = letters[1:10],
                 B2 = letters[11:20])
df[, -grep("A", colnames(df))]

Таким образом, ваша проблема скорее является проблемой регулярного выражения, а не тем, как удалить столбцы. Если я запустил ваш код, я получаю сообщение об ошибке:

df[, -grep("\\3$", colnames(df))]
Error in grep("\\3$", colnames(df)) : 
  invalid regular expression '\3$', reason 'Invalid back reference'

Обновление. Почему бы вам просто не использовать это следующее выражение?

df[, -grep("1$", colnames(df))]
   ID         A2 B2
1   1  2.0957940  k
2   2 -1.7177042  l
3   3 -0.0448357  m
4   4  1.2899925  n
5   5  0.7569659  o
6   6 -0.5048024  p
7   7  0.6929080  q
8   8 -0.5116399  r
9   9 -1.2621066  s
10 10  0.7664955  t

Ответ 2

Я нашел простой ответ, используя Tidyverse. Если ваши имена содержат "This", то все переменные, содержащие "This", будут удалены.

library(tidyverse) 
df_new <- df %>% select(-contains("This"))

Ответ 3

Как дополнительный ответ, так как я наткнулся на это, когда искал решение data.table для этой проблемы.

library(data.table)
dt <- data.table(df)
drop.cols <- grep("1$", colnames(dt))
dt[, (drop.cols) := NULL]

Ответ 4

Для исключения любой строки вы можете использовать...

 # Search string to exclude
 strng <- "1"
 df <- data.frame(matrix(runif(25,max=10),nrow=5))
 colnames(df) <- paste( "EX" , 1:5 )
 df_red <- df[, -( grep(paste0( strng , "$" ) , colnames(df),perl = TRUE) ) ]

    df
#         EX 1     EX 2        EX 3     EX 4     EX 5
#   1 7.332913 4.972780 1.175947853 6.428073 8.625763
#   2 2.730271 3.734072 6.031157537 1.305951 8.012606
#   3 9.450122 3.259247 2.856123205 5.067294 7.027795
#   4 9.682430 5.295177 0.002015966 9.322912 7.424568
#   5 1.225359 1.577659 4.013616377 5.092042 5.130887

    df_red
#         EX 2        EX 3     EX 4     EX 5
#   1 4.972780 1.175947853 6.428073 8.625763
#   2 3.734072 6.031157537 1.305951 8.012606
#   3 3.259247 2.856123205 5.067294 7.027795
#   4 5.295177 0.002015966 9.322912 7.424568
#   5 1.577659 4.013616377 5.092042 5.130887