使用R从表中删除NA

时间:2016-12-04 13:40:54

标签: r row na

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

  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 个答案:

答案 0 :(得分:1)

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)