在R数据帧的选定因子列中将NA更改为“N”

时间:2015-07-15 19:01:44

标签: r dataframe apply

我有一个带有因子列的以下数据框。

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"

在我的原始数据中,我有很多专栏。所以我想避免逐列进行。

1 个答案:

答案 0 :(得分:4)

&#39;等级&#39;选择的&#39;操作前的列是:

 lapply(df[selected], levels)
 #$b
 #[1] "1" "2"

 #$c
 #[1] "1" "2" "3"

我们可以循环播放&#39;选中&#39;中的列。使用lapply,包含&#39; N&#39;作为每列中的一个级别,replace&#39; NA&#39;值为&#39; N&#39;。

 df[selected] <- lapply(df[selected], function(x) {
          levels(x) <- c(levels(x), 'N')
           replace(x, which(is.na(x)), 'N')
            })

或另外一个选项recode来自car,我们可以直接更改&#39; NA&#39;到了&#39; N&#39;它会自动更新级别。

 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"

如果我们想添加&#34; NA&#34;另一个有用的功能是addNA。其中一个级别

df[selected] <- lapply(df[selected], addNA)

注意:非数字列上apply的输出将是&#39;字符&#39;类。我想那不是你想要的。