簡體   English   中英

在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"

在我的原始數據中,我有很多列。 因此,我想避免逐列進行。

操作前“選定”列的“級別”為:

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

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

我們可以使用lapply在“ selected”中的列上“循環”,在每列中lapply “ N”個級別,並用“ N” replace “ NA”值。

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

另一個選擇是從car recode ,我們可以直接將'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"

如果我們要添加“ NA”級別之一,則另一個有用的功能是addNA

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

注意:在非數字列上apply的輸出將是'character'類。 我想那不是你想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM