仅规范化R

时间:2018-02-01 11:40:21

标签: r

我是R的新手,仍然掌握着如何处理数据(我的背景是电子表格和数据库)。我遇到的问题如下。我的数据看起来像这样(它以CSV格式保存):

RecNo   Var1    Var2    Var3
41     800     201.8    Y
43     140        39    N
47      60     20.24    N
49     687        77    Y
54     570       135    Y
58    1250       467    N
61     211        52    N
64      96     117.3    N
68     687        77    Y

第1列(RecNo)是我的观察号码;虽然它是一个数字,但我的分析不需要它。第4列(Var3)是Yes / No列,我目前不需要进行分析,但稍后需要在输出中添加信息。

我需要将数据框中的数值数据规范化为0到1之间的值,而不会丢失其他信息。我有以下功能:

normalize <- function(x) { 
   x <- sweep(x, 2, apply(x, 2, min)) 
   sweep(x, 2, apply(x, 2, max), "/") 
} 

但是,当我通过调用将它应用于我的上述数据时     myResult <- normalize(myData)

由于第4列中的文本而返回错误。如果我将此列中的文本设置为二进制值,它运行正常,但也会将我的案例编号规范化,这是我不想要的。

所以,我的问题是:如何更改上面的normalize函数以接受要转换的列的名称,同时输出完整的数据集(即不丢失列)?

2 个答案:

答案 0 :(得分:1)

我无法得到TUSHAr的建议,但我找到了两种解决方案可行: 1. akrun的建议如上:

myData2 <- myData1 %>% mutate_at(2:3, funs((.-min(.))/max(.-min(.))))

这会产生以下结果:

RecNo       Var1       Var2 Var3
1    41 0.62184874 0.40601834    Y
2    43 0.06722689 0.04195255    N
3    47 0.00000000 0.00000000    N
4    49 0.52689076 0.12693105    Y
5    54 0.42857143 0.25663508    Y
6    58 1.00000000 1.00000000    N
7    61 0.12689076 0.07102414    N
8    64 0.03025210 0.21718329    N
9    68 0.52689076 0.12693105    Y

或者,有一个包BBmisc在将我的记录号转换为因子后允许我使用以下内容:

> myData <- myData %>% mutate(RecNo = factor(RecNo))
> myNorm <- normalize(myData2, method="range", range = c(0,1), margin = 1)
> myNorm
  RecNo       Var1       Var2 Var3
1    41 0.62184874 0.40601834    Y
2    43 0.06722689 0.04195255    N
3    47 0.00000000 0.00000000    N
4    49 0.52689076 0.12693105    Y
5    54 0.42857143 0.25663508    Y
6    58 1.00000000 1.00000000    N
7    61 0.12689076 0.07102414    N
8    64 0.03025210 0.21718329    N
9    68 0.52689076 0.12693105    Y

编辑:为了完成,我还包括了TUSHAr的解决方案,一如既往地表明有很多方法可以解决一个问题:

normalize<-function(x){
    minval=apply(x[,c(2,3)],2,min)
    maxval=apply(x[,c(2,3)],2,max)
    #print(minval)
    #print(maxval)
    y=sweep(x[,c(2,3)],2,minval)
    #print(y)
    sweep(y,2,(maxval-minval),"/")
}

df[,c(2,3)]=normalize(df)

感谢您的帮助!

答案 1 :(得分:1)

normalize<-function(x){
    minval=apply(x[,c(2,3)],2,min)
    maxval=apply(x[,c(2,3)],2,max)
    #print(minval)
    #print(maxval)
    y=sweep(x[,c(2,3)],2,minval)
    #print(y)
    sweep(y,2,(maxval-minval),"/")
}

df[,c(2,3)]=normalize(df)