Mam ramę danych, w której każda kolumna składa się z liczby, a następnie tekst, np. 533 234R / R .

Poniższy kod, aby pozbyć się tekstu dobrze działa:

  my_data <- my_data %>%
    mutate(column1 = str_extract(column1, '.+?(?=[a-z])'))

Chciałbym to zrobić dla wielu kolumn:

col_names <- names(my_data)
for (i in 1:length(col_names)) {
  my_data <- my_data%>%
    mutate(col_names[i] = str_extract(col_names[i], '.+?(?=[a-z])'))
}

Ale zwraca błąd:

Error: unexpected '=' in:
"  my_data <- my_data %>%
    mutate(col_names[i] ="

Myślę, że Mutate_all () nie działa również, BCOS str_extract () wymaga nazwy kolumny jako argumentu.

1
SlavicDoomer 23 listopad 2020, 00:25

1 odpowiedź

Najlepsza odpowiedź

Jeśli używamy ciągów, a następnie przekonwertuj na sym bol i oceniaj ({x1}}), gdy wykonamy przypisanie (:=)

library(dplyr)
library(stringr)
col_names <- names(my_data)
for (i in seq_along(col_names)) {
  my_data <- my_data   %>%
          mutate(!! col_names[i] := 
            str_extract(!!rlang::sym(col_names[i]), '.+?(?=[a-z])'))
       }

W tidyverse możemy to zrobić za pomocą across zamiast zapętlić pętlę for (dplyr wersja >= 1.0)

my_data <- my_data %>%
      mutate(across(everything(), ~ str_extract(., '.+?(?=[a-z])')))

Jeśli wersja dplyr jest stara, użyj mutate_all

my_data <- my_data %>%
          mutate_all(~ str_extract(., '.+?(?=[a-z])'))
0
akrun 22 listopad 2020, 21:27