R: применение gsub к фреймам данных возвращает NA - PullRequest
1 голос
/ 16 апреля 2019

Я пытаюсь преобразовать фрейм данных, который содержит числа и пробелы, в числовой. В настоящее время числа имеют формат factor, а некоторые имеют ",".

df <- data.frame(num1 = c("123,456,789", "1,234,567", "1,234", ""), num2 = c("","1,012","","202"))
df
         num1  num2
1 123,456,789      
2   1,234,567 1,012
3       1,234      
4               202

Удалить "," и преобразовать в числовой формат:

df2 = as.numeric(gsub(",","",df))
Warning message:
NAs introduced by coercion

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

df$num1 = as.numeric(gsub(",","",df$num1)) 
df$num2 = as.numeric(gsub(",","",df$num2))
df
             num1  num2
    1   123456789    NA
    2     1234567  1012
    3        1234    NA
    4          NA   202

Мои вопросы: 1. В чем причина, и если есть способ избежать их преобразования столбец за столбцом, поскольку фактический фрейм данных имеет гораздо больше столбцов; и 2. Как лучше всего удалить NA или заменить их на 0 для будущих числовых операций? Я знаю, что могу использовать gsub, но просто задаюсь вопросом, есть ли лучший способ.

1 Ответ

1 голос
/ 16 апреля 2019

Мы можем использовать replace_na после замены , на '' (str_replace_all)

library(dplyr)
library(stringr)
df %>% 
   mutate_all(list(~ str_replace_all(., ",", "") %>% 
                        as.numeric %>%
                        replace_na(0)))
#       num1 num2
#1 123456789    0
#2   1234567 1012
#3      1234    0
#4         0  202

Проблема с gsub/sub заключается в том, что он работает на vector, как описано в ?gsub

х, текст - символьный вектор, в котором ищутся совпадения, или объект, который as.character может привести к символьному вектору. Поддерживаются длинные векторы.

Мы можем зациклить столбцы, применить gsub и присвоить вывод исходному набору данных

df[] <- lapply(df, function(x) as.numeric(gsub(",", "", x))) 
df[is.na(df)] <- 0 # change the NA elements to 0
...