删除NA的距离,使用R
问题描述:
我有一个表看起来像这样的表(注意,同一ID行去三个不同的行,因为没有足够多的空间):删除NA的距离,使用R
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)
请显示的问题输入所以在重现的形式,使得任何人都可以复制并粘贴到自己的会话。此外,示例应该尽可能少,以便在减少问题的同时减少列数。见[mcve]。这次我在回答结尾处的注释中为你做了这件事。 –