Удалить строку из нескольких столбцов, только если она находится в начале строки в R - PullRequest
1 голос
/ 08 июля 2019

У меня есть фрейм данных, в котором есть много столбцов, называемых фактом (в данном примере fact1, fact2 и fact3), в которых есть символы. Все они начинаются со old_, и я хочу удалить это. В моем реальном наборе данных много столбцов, поэтому я не хочу делать это по всем. Я видел решение здесь Получение и удаление первого символа строки , но когда я пытаюсь применить его, я получаю ошибку.

library(tidyverse)
problem <- tibble(name = c("Random", "Silly"), height = c(48, 50), weight = c(95, 102), fact1 = c("old_song_yes", "old_dance_no"), fact2 = c("old_bold_yes", "old_shy_no"), fact3 = c("old_cold_yes", "old_young_yes"))

Вот мое решение, которое не работает вместе с сообщением об ошибке:

apply(problem, substring(problem, 5, nchar(problem)))
Error in match.fun(FUN) : argument "FUN" is missing, with no default

Важно, чтобы он только удалял строку с самого начала; в противном случае, например, в столбце fact3 он будет выглядеть как «cyes» вместо «cold_yes».

И наконец, если это поможет, я включил то, что я хочу, чтобы конечный продукт выглядел здесь:

library(tidyverse)
solution <- tibble(name = c("Random", "Silly"), height = c(48, 50), weight = c(95, 102), fact1 = c("song_yes", "dance_no"), fact2 = c("bold_yes", "shy_no"), fact3 = c("cold_yes", "young_yes"))

Если у вас есть опрятное решение или решение, которое охватывает только столбцы фактов, я бы особенно признателен вам за это, спасибо!

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Одна dplyr возможность может быть:

problem %>%
 mutate_at(vars(starts_with("fact")), list(~ sub("^old_", "\\1", .)))

  name   height weight fact1    fact2    fact3    
  <chr>   <dbl>  <dbl> <chr>    <chr>    <chr>    
1 Random     48     95 song_yes bold_yes cold_yes 
2 Silly      50    102 dance_no shy_no   young_yes

Или:

problem %>%
 mutate_at(vars(starts_with("fact")), list(~ substr(., 5, nchar(.))))
0 голосов
/ 08 июля 2019

Мы можем просто использовать gsub.

problem[] <- Map(gsub, "^old_", "", problem)
problem
#     name height weight    fact1    fact2     fact3
# 1 Random     48     95 song_yes bold_yes  cold_yes
# 2  Silly     50    102 dance_no   shy_no young_yes
...