将DataFrame中的多个因子变量替换为NA值

时间:2018-10-20 12:09:26

标签: r for-loop dplyr

我们有200列以上的DataFrame df,它具有两种类型的变量numericfactor。这两个变量均具有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)))

我尝试为df_factor数据帧写入for loop,以将所有"NA"的值替换为"Some-value"

col <- colnames(df_factor)

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

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

我们可以将其转换为字符,然后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

答案 1 :(得分:0)

我仍然不确定您的目标是什么。循环似乎有点不对劲。

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

如果为nlevels()插入x值,则可以使用 示例: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
}

应该做的事

答案 2 :(得分:0)

借用Ronak的数据:

使用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 参数:

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

R为底:

if i%n == 0: