Замените значение NA для нескольких факторных переменных в DataFrame - PullRequest
0 голосов
/ 20 октября 2018

у нас есть DataFrame df с более чем 200 столбцами, он имеет два типа переменных numeric и factor.Обе переменные, имеющие значения NA.

Step 1: сначала разделили наборы данных на две части, числовые и наборы данных, имеющие только факторные переменные.

df_num <- (df , is.numeric)

df_factor <- select_if(df , is.factor)

шаг 2:

df <- df %>%
      mutate_if(is.numeric , funs(replace(., is.na(.), 0)))

шаг 3:

df_factor <- df_factor %>%
          mutate_if(is.character , funs(replace(., is.na(.), 0)))

я пытался написать for loop для фрейма данных df_factor, чтобы заменить все значения "NA" на "Some-value"

col <- colnames(df_factor)

for (i in col) {
    df_factor$[i] <- as.numeric(nlevels()) #I am stuck here
}

, может кто-нибудь помочьна этом?

Ответы [ 3 ]

0 голосов
/ 20 октября 2018

Мы можем преобразовать его в символ, а затем replace значение

library(dplyr)
df_factor %>%
    mutate_all(funs(replace(as.character(.), is.na(.), "some_value")))

Если вы хотите преобразовать его обратно в factor

df_factor %>%
    mutate_all(funs(factor(replace(as.character(.), is.na(.), "some_value"))))

Или если мы хотимиспользуйте df напрямую вместо df_factor

df %>%
  mutate_if(is.factor, funs(factor(replace(as.character(.), is.na(.), "some_value"))))

Добавление воспроизводимого примера для проверки

df <- data.frame(col1 = c(NA, letters[1:5]), col2 = c(1:5, NA), 
                 col3 = c(NA, letters[14:17], NA))

df

# col1 col2 col3
#1 <NA>    1 <NA>
#2    a    2    n
#3    b    3    o
#4    c    4    p
#5    d    5    q
#6    e   NA <NA>

df %>%
  mutate_if(is.factor, funs(factor(replace(as.character(.), is.na(.), "some_value"))))


#        col1 col2       col3
#1 some_value    1 some_value
#2          a    2          n
#3          b    3          o
#4          c    4          p
#5          d    5          q
#6          e   NA some_value
0 голосов
/ 20 октября 2018

Заимствование данных Ронака:

Использование dplyr::recode_factor и аргумента missing:

library(dplyr)
df %>% mutate_if(is.factor, recode_factor, missing ="some_value")

#         col1 col2       col3
# 1 some_value    1 some_value
# 2          a    2          n
# 3          b    3          o
# 4          c    4          p
# 5          d    5          q
# 6          e   NA some_value

с базой R:

fct_lgl <- sapply(df,is.factor)
df[fct_lgl] <- lapply(
  df[fct_lgl], 
  function(x) {
    x <- addNA(x)
    levels(x)[nlevels(x)] <- "some_value"
    x})

df
#         col1 col2       col3
# 1 some_value    1 some_value
# 2          a    2          n
# 3          b    3          o
# 4          c    4          p
# 5          d    5          q
# 6          e   NA some_value
0 голосов
/ 20 октября 2018

Я все еще не совсем уверен, какова ваша цель.Цикл кажется немного выключенным, хотя.

for (i in 1:length(col)){
  df_factor[,i] <- as.numeric(nlevels()) #I am stuck here
}

Работает, если вы включаете значение топора для nlevels () Пример: nlevels(df_factor[,i])

Редактировать:

Если ваша цель состоит в том, чтобызамените NA на уровни фактора, тогда

df_factorNew <- df_factor
for (i in 1:length(col)){
  if (is.na(df_factor[j,i]) == T){
  df_factorNew[j,i] <- as.numeric(nlevels(df_factor[,i])) #I am stuck here
}

должен выполнить работу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...