我们有200列以上的DataFrame df
,它具有两种类型的变量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)))
我尝试为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
}
有人可以帮忙吗?
答案 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: