Удалить строку в имени столбца, если условие - PullRequest
0 голосов
/ 10 мая 2018

У меня есть датафрейм, который выглядит так:

df

Col+djek    Col_test+deg    Col_+dege     Col_+test
       1               1            1             1

В имени столбца как удалить что-либо после символа «+», если имя столбца не содержит строку «test»?

Это была моя попытка, но она выдала мне ошибку:

colnames(df) = if(!grepl(df, "test")){ gsub("+.*","",colnames(df))}

Окончательный вывод должен быть таким:

     Col    Col_test+deg         Col_     Col_+test
       1               1            1             1

1 Ответ

0 голосов
/ 10 мая 2018

Вы можете использовать

gsub("^(?!.*test)([^+]*)\\+.*","\\1", colnames(df), perl=TRUE)

См. Демоверсию regex .

Подробности

  • ^ - начало строки
  • (?!.*test) - отрицательный прогноз (поддерживается в шаблонах PCRE с помощью perl=TRUE), который не дает совпадения, если после любых 0+ символов, кроме символов разрыва строки, есть подстрока test
  • ([^+]*) - Группа захвата # 1: 0 или более символов, отличных от +
  • \\+ - знак +
  • .* -остаток строки до конца.

\1 в аргументе замены восстанавливает значение группы 1 в результирующей строке.

Фрагмент тестирования R:

> names <- c("Col+djek", "Col_test+deg", "Col_+dege", "Col_+test")
> gsub("^(?!.*test)([^+]*)\\+.*","\\1", names, perl=TRUE)
[1] "Col"          "Col_test+deg" "Col_"         "Col_+test"
...