使用 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)
我有一个 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)