Применить функцию mgsub ко всему data.frame в R - PullRequest
3 голосов
/ 19 января 2020

Я часто работаю с таблицами, заполненными специальными символами (например, á, š, č, ť, ž, ý, á, é, ... et c.). Я нашел очень полезную функцию под названием mgsub, которая может выполнять одновременную замену нескольких строк. Я хорошо работаю с вектором, но я пытаюсь применить какую функцию ко всему фрейму данных.

Функция mgsub работает так:

library(mgsub)
mgsub::mgsub("...A čo i tam dušu dáš v tom boji divokom: Mor ty len, a voľ nebyť, ako byť otrokom.",
             pattern = c(".","A","č","š","á",":",",","ľ","ť","M"," "),
         replacement = c("","a","c","s","a","","","","t","m",""), fixed = TRUE)
[1] "acoitamdusudasvtombojidivokommortylenavonebytakobytotrokom"

Но как применить эту функцию ко всему data.frame? Например, на этом data.frame ...

my.df <- data.frame(v1 = c("...A čo i tam dušu","dáš v tom boji"),
                    v2 = c("divokom:","Mor ty len,"),
                    v3 = c("a voľ nebyť,","ako byť otrokom."))

                  v1          v2               v3
1 ...A čo i tam dušu    divokom:     a voľ nebyť,
2     dáš v tom boji Mor ty len, ako byť otrokom.

Я попытался применить это. но это дает только ошибки ...

data.frame(lapply(my.df, mgsub::mgsub,
                  pattern = c(".","A","č","š","á",":",",","ľ","ť","M"," "),
                  replacement = c("","a","c","s","a","","","","t","m",""), fixed = TRUE))
Error in nchar(string) : 'nchar()' requires a character vector

Любые предложения приветствуются.

1 Ответ

2 голосов
/ 19 января 2020

Проблема в том, что столбцы factor, а mgsub требует ввода character. В соответствии со строкой ?mgsub

- вектор символов, в котором ищутся замены


Либо преобразуйте все столбцы в character class

my.df[] <- lapply(my.df, as.character)

Или используйте type.convert

my.df <- type.convert(my.df, as.is = TRUE) 

Или используйте stringsAsFactors = FALSE при создании data.frame в качестве параметра по умолчанию в data.frame: stringsAsFactors = TRUE

my.df <- data.frame(v1 = c("...A čo i tam dušu","dáš v tom boji"),
                    v2 = c("divokom:","Mor ty len,"),
                    v3 = c("a voľ nebyť,","ako byť otrokom."), 
         stringsAsFactors = FALSE)
...