我是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
函数以接受要转换的列的名称,同时输出完整的数据集(即不丢失列)?
答案 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)