使用用户定义的函数对行上的数据进行规范化,并在行中使用NA值

时间:2016-09-20 06:17:19

标签: r apply na

我正在尝试对数据帧的行进行一般功能缩放[0.1,0.9]。 (我们称之为市场)。有些列有NA值,我想忽略但不会在处理中省略。我使用apply来执行操作,但是每个具有一个NA值的行都会在结果中变为全部NA。 这是一个例子:

这是我的函数,用于规范行条目[0.1, 0.9]

Norm <- function(x) 0.1+(x-min(x))*0.8/(max(x)-min(x))

市场数据框包含一些非数字的列 (前四列),所以我只使用列[5:16]进行计算

这里是前15行数据框市场[1:15,5:16]

的快照
     Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov  Dec
1     NA    NA    NA    NA    NA    NA    NA  1.46  1.20  1.20    NA   NA
2     NA 41.67 40.00 40.00    NA    NA    NA    NA    NA    NA    NA   NA
3     NA    NA    NA    NA    NA    NA    NA 12.00 12.00    NA    NA   NA
4  57.50    NA 31.11 41.00 54.64 55.00 55.00 55.00 55.00 53.00 47.00 33.0
5  12.17  9.17    NA    NA    NA    NA 11.00 11.00 10.22    NA    NA   NA
6  15.67 30.00 30.00 40.00 50.94    NA    NA    NA    NA    NA 62.33 56.5
7  12.05 13.50    NA    NA    NA    NA    NA    NA    NA  7.50  8.83   NA
8     NA    NA    NA    NA    NA    NA    NA 10.00  6.13    NA    NA   NA
9   1.90    NA    NA    NA    NA    NA  2.00  2.00    NA  1.88  1.51  1.7
10  2.00  1.91  1.81  1.81  1.85  2.00  2.00  2.05  2.09  1.90    NA   NA
11 24.11 29.17 35.00 35.00 35.00 30.45 30.00 29.67 24.09 20.00 20.00 23.0
12    NA 27.50 32.50 35.00    NA    NA 33.88 23.00    NA    NA 21.33 20.0
13 27.00 33.75    NA 24.50 28.00    NA    NA    NA    NA    NA    NA   NA
14    NA    NA    NA    NA    NA    NA 33.63 23.50    NA    NA    NA   NA
15 23.67 27.33 27.55 26.00 30.71 27.83    NA    NA    NA    NA 24.00 24.0

我想要做的是用每行中可用的数据标准化每一行[0.1,0.9]。也就是说,结果应该是:

     Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov  Dec
1     NA    NA    NA    NA    NA    NA    NA  0.90  0.10  0.10    NA   NA
2     NA  0.90  0.10  0.10    NA    NA    NA    NA    NA    NA    NA   NA
3     NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA   NA
4   0.90    NA   0.10  0.40  0.81  0.82  0.82  0.82  0.82  0.76  0.58  0.16
5  ...
6  ...
7  ...
8  ...  
9  ... 
10  0.64   0.38  0.10  0.10  0.21  0.64  0.64  0.78  0.90  0.36   NA   NA 
11  0.32   0.59  0.90  0.90  0.90  0.66  0.63  0.62  0.32  0.10  0.10 0.26
12  ...
13  ...
14    NA    NA    NA    NA    NA    NA   0.90  0.10   NA    NA    NA   NA
15  0.10   0.52  0.54  0.36  0.90  0.57   NA    NA    NA    NA   0.14 0.14 

因此,虽然忽略了NA值,但每行都不会省略它们。 但是当我使用以下命令时,使用apply,所有行都变为NA,除了第11行,其中没有NA条目。

这是我试图获得上述结果的应用命令,但无济于事:

Market_normed <- data.frame(t(apply(Market[5:16], 1, Norm)

这是我得到的UNWANTED结果:

Market2012_nom [1:15,]

      Jan       Feb Mar Apr May       Jun       Jul       Aug       Sep Oct Nov  Dec
1      NA        NA  NA  NA  NA        NA        NA        NA        NA  NA  NA   NA
2      NA        NA  NA  NA  NA        NA        NA        NA        NA  NA  NA   NA
3      NA        NA  NA  NA  NA        NA        NA        NA        NA  NA  NA   NA
4      NA        NA  NA  NA  NA        NA        NA        NA        NA  NA  NA   NA
5      NA        NA  NA  NA  NA        NA        NA        NA        NA  NA  NA   NA
6      NA        NA  NA  NA  NA        NA        NA        NA        NA  NA  NA   NA
7      NA        NA  NA  NA  NA        NA        NA        NA        NA  NA  NA   NA
8      NA        NA  NA  NA  NA        NA        NA        NA        NA  NA  NA   NA
9      NA        NA  NA  NA  NA        NA        NA        NA        NA  NA  NA   NA
10     NA        NA  NA  NA  NA        NA        NA        NA        NA  NA  NA   NA
11 0.3192 0.5890667 0.9 0.9 0.9 0.6573333 0.6333333 0.6157333 0.3181333 0.1 0.1 0.26
12     NA        NA  NA  NA  NA        NA        NA        NA        NA  NA  NA   NA
13     NA        NA  NA  NA  NA        NA        NA        NA        NA  NA  NA   NA
14     NA        NA  NA  NA  NA        NA        NA        NA        NA  NA  NA   NA
15     NA        NA  NA  NA  NA        NA        NA        NA        NA  NA  NA   NA

我有一种感觉,我需要改变我使用apply的方式或我定义我的函数的方式。任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:1)

minmax都有一个na.rm=选项来忽略缺失值。

例如

min(x, na.rm=TRUE)

当我使用

 Norm <- function(x) 0.1+(x-min(x, na.rm=T))*0.8/(max(x, na.rm=T)-min(x, na.rm=T))

我明白了:

    Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
1    NA   NA   NA   NA   NA   NA   NA 0.90 0.10 0.10   NA   NA
2    NA 0.90 0.10 0.10   NA   NA   NA   NA   NA   NA   NA   NA
3    NA   NA   NA   NA   NA   NA   NA  NaN  NaN   NA   NA   NA
4  0.90   NA 0.10 0.40 0.81 0.82 0.82 0.82 0.82 0.76 0.58 0.16
5  0.90 0.10   NA   NA   NA   NA 0.59 0.59 0.38   NA   NA   NA
6  0.10 0.35 0.35 0.52 0.70   NA   NA   NA   NA   NA 0.90 0.80
7  0.71 0.90   NA   NA   NA   NA   NA   NA   NA 0.10 0.28   NA
8    NA   NA   NA   NA   NA   NA   NA 0.90 0.10   NA   NA   NA
9  0.74   NA   NA   NA   NA   NA 0.90 0.90   NA 0.70 0.10 0.41
10 0.64 0.39 0.10 0.10 0.21 0.64 0.64 0.79 0.90 0.36   NA   NA
11 0.32 0.59 0.90 0.90 0.90 0.66 0.63 0.62 0.32 0.10 0.10 0.26
12   NA 0.50 0.77 0.90   NA   NA 0.84 0.26   NA   NA 0.17 0.10
13 0.32 0.90   NA 0.10 0.40   NA   NA   NA   NA   NA   NA   NA
14   NA   NA   NA   NA   NA   NA 0.90 0.10   NA   NA   NA   NA
15 0.10 0.52 0.54 0.36 0.90 0.57   NA   NA   NA   NA 0.14 0.14