使用 R 从 table 中删除 NA

Removing NA's from the table using R

我有一个 table 看起来像这样(请注意,相同的 ID 行分为三个不同的行,因为没有足够的 space):

  ID    INVENT_KPV KASVUKOHA_KOOD RINDE_KOOD PUULIIGI_KOOD VANUS AASTA
7900249 2002.12.01             MD          1            KS    60  1942
8200249 2002.12.01             AN          1            KS    50  1952
8300249 2002.12.01             AN         NA            NA    NA    NA
KORGUS TAGAVARA OSAKAAL RINDE_KOOD PUULIIGI_KOOD VANUS AASTA KORGUS TAGAVARA
    15       17      30          1            KS    35  1967     11       39
    20       76      40          1            LV    45  1957     18      115
    NA       NA      NA         NA            NA    NA    NA     NA       NA
OSAKAAL RINDE_KOOD PUULIIGI_KOOD VANUS AASTA KORGUS TAGAVARA OSAKAAL
     70         NA            NA    NA    NA     NA       NA      NA
     60         NA            NA    NA    NA     NA       NA      NA
     NA          J            KU    25  1977      3        0     100

我希望它是这样的:

ID      INVENT_KPV KASVUKOHA_KOOD RINDE_KOOD PUULIIGI_KOOD VANUS AASTA 
7900249 2002.12.01             MD          1            KS    60  1942
8200249 2002.12.01             AN          1            KS    50  1952
8300249 2002.12.01             AN          J            KU    25  1977
KORGUS TAGAVARA OSAKAAL RINDE_KOOD PUULIIGI_KOOD VANUS AASTA KORGUS TAGAVARA
   15       17      30          1            KS    35  1967     11       39
   20       76      40          1            LV    45  1957     18      115
    3        0     100         
OSAKAAL RINDE_KOOD PUULIIGI_KOOD VANUS AASTA KORGUS TAGAVARA OSAKAAL
    70         
    60         

所以 NA 消失了,有些行(例如 ID=8300249)比其他行更短。

1) 如果您尝试将字符串(包括空字符串)与数字混合使用,则整个列将变成字符或因子,导致结果无法使用;但是,如果您只是为了打印目的而这样做,那么它会很好并且可以这样做:

m <- as.matrix(DF)
as.data.frame(replace(m, is.na(m), ""))

给予:

       ID INVENT_KPV KASVUKOHA_KOOD RINDE_KOOD PUULIIGI_KOOD VANUS AASTA
1 7900249 2002.12.01             MD          1            KS    60  1942
2 8200249 2002.12.01             AN          1            KS    50  1952
3 8300249 2002.12.01             AN          

2) 如果你真的想要更短的行,另一种方法是放弃使用矩形表示的想法,而是使用行列表,如下所示:

lapply(split(DF, seq_len(nrow(DF))), function(x) x[, !is.na(x)])                           

给予:

$`1`
       ID INVENT_KPV KASVUKOHA_KOOD RINDE_KOOD PUULIIGI_KOOD VANUS AASTA
1 7900249 2002.12.01             MD          1            KS    60  1942

$`2`
       ID INVENT_KPV KASVUKOHA_KOOD RINDE_KOOD PUULIIGI_KOOD VANUS AASTA
2 8200249 2002.12.01             AN          1            KS    50  1952

$`3`
       ID INVENT_KPV KASVUKOHA_KOOD
3 8300249 2002.12.01             AN

注意:可重现形式的输入DF是:

Lines <- " ID    INVENT_KPV KASVUKOHA_KOOD RINDE_KOOD PUULIIGI_KOOD VANUS AASTA
7900249 2002.12.01             MD          1            KS    60  1942
8200249 2002.12.01             AN          1            KS    50  1952
8300249 2002.12.01             AN         NA            NA    NA    NA"
DF <- read.table(text = Lines, header = TRUE)