在 R 数据框中选定的因子列中将 NA 更改为 "N"
Changing NA to "N" in selected factor columns in R data frame
我有以下带有因子列的数据框。
set.seed(1234)
df <- data.frame(a=sample(c("1","2",NA), 10, replace=T),
b=sample(c("1","2",NA), 10, replace=T),
c=sample(c("1","2","3",NA), 10, replace=T))
也就是
df
a b c
1 1 <NA> 2
2 2 2 2
3 2 1 1
4 2 <NA> 1
5 <NA> 1 1
6 2 <NA> <NA>
7 1 1 3
8 1 1 <NA>
9 2 1 <NA>
10 2 1 1
现在,我想为选定的列创建一个新级别 "N",并将这些列中的所有 NA 转换为 "N"。我通过
创建了一个选定列名称的向量
selected <- c("b", "c")
然后尝试按以下方式使用apply
apply(df, 2, function(x) {(if x %in% selected) x <- factor(x, levels=c(levels(x), 'N'))})
但是报错:
Error: unexpected symbol in "apply(df, 2, function(x) {(if x"
在我的原始数据中,我有很多列。所以我想避免逐列进行。
运算前'selected'列的'levels'为:
lapply(df[selected], levels)
#$b
#[1] "1" "2"
#$c
#[1] "1" "2" "3"
我们可以 'loop' 使用 lapply
覆盖 'selected' 中的列,将 'N' 作为每个列中的另一个级别,并且 replace
'NA' 值 'N'.
df[selected] <- lapply(df[selected], function(x) {
levels(x) <- c(levels(x), 'N')
replace(x, which(is.na(x)), 'N')
})
或者另一个选项是recode
从car
,我们可以直接把'NA'改成'N'。它会自动更新级别。
library(car)
df[selected] <- lapply(df[selected], recode, "NA='N'")
lapply(df[selected], levels)
#$b
#[1] "1" "2" "N"
#$c
#[1] "1" "2" "3" "N"
另一个有用的函数是 addNA
如果我们想添加 "NA" 其中一个级别
df[selected] <- lapply(df[selected], addNA)
注意:apply
在非数字列上的输出将是 'character' class。我猜这不是你想要的。
我有以下带有因子列的数据框。
set.seed(1234)
df <- data.frame(a=sample(c("1","2",NA), 10, replace=T),
b=sample(c("1","2",NA), 10, replace=T),
c=sample(c("1","2","3",NA), 10, replace=T))
也就是
df
a b c
1 1 <NA> 2
2 2 2 2
3 2 1 1
4 2 <NA> 1
5 <NA> 1 1
6 2 <NA> <NA>
7 1 1 3
8 1 1 <NA>
9 2 1 <NA>
10 2 1 1
现在,我想为选定的列创建一个新级别 "N",并将这些列中的所有 NA 转换为 "N"。我通过
创建了一个选定列名称的向量selected <- c("b", "c")
然后尝试按以下方式使用apply
apply(df, 2, function(x) {(if x %in% selected) x <- factor(x, levels=c(levels(x), 'N'))})
但是报错:
Error: unexpected symbol in "apply(df, 2, function(x) {(if x"
在我的原始数据中,我有很多列。所以我想避免逐列进行。
运算前'selected'列的'levels'为:
lapply(df[selected], levels)
#$b
#[1] "1" "2"
#$c
#[1] "1" "2" "3"
我们可以 'loop' 使用 lapply
覆盖 'selected' 中的列,将 'N' 作为每个列中的另一个级别,并且 replace
'NA' 值 'N'.
df[selected] <- lapply(df[selected], function(x) {
levels(x) <- c(levels(x), 'N')
replace(x, which(is.na(x)), 'N')
})
或者另一个选项是recode
从car
,我们可以直接把'NA'改成'N'。它会自动更新级别。
library(car)
df[selected] <- lapply(df[selected], recode, "NA='N'")
lapply(df[selected], levels)
#$b
#[1] "1" "2" "N"
#$c
#[1] "1" "2" "3" "N"
另一个有用的函数是 addNA
如果我们想添加 "NA" 其中一个级别
df[selected] <- lapply(df[selected], addNA)
注意:apply
在非数字列上的输出将是 'character' class。我猜这不是你想要的。