如何在R中使用分组对数据进行标准化/归一化,使其在-1和1之间缩放?

3

我有这样的数据:

Name Data
A      5
A      6
A     -1
A     -3
B      6
B      2
B     -1
B      9

我希望将数据规范化,使得数值在-1和1之间。我还想按名称对其进行分组。

以下是我的尝试:

library(dplyr)
library(scales)

df2 <- df %>% 
  group_by(name) %>%  
  rescale(Data,to=c(-1,1))

我遇到了这个错误:

使用UseMethod("rescale")时出错: 对于类"c('grouped_df', 'tbl_df', 'tbl', 'data.frame')"的对象,没有适用的方法。


这个回答解决了你的问题吗?在R中标准化向量,使值向边界移动 - eduardokapp
1
你拼写“Name”错了。 - IRTFM
2个回答

2

应该在mutate内部

library(dplyr)
library(scales)
df %>% 
    group_by(Name) %>%
    mutate(Data = rescale(Data, to = c(-1, 1))) %>%
    ungroup

-输出

# A tibble: 8 x 2
  Name    Data
  <chr>  <dbl>
1 A      0.778
2 A      1    
3 A     -0.556
4 A     -1    
5 B      0.4  
6 B     -0.4  
7 B     -1    
8 B      1    

数据

df <- structure(list(Name = c("A", "A", "A", "A", "B", "B", "B", "B"
), Data = c(5L, 6L, -1L, -3L, 6L, 2L, -1L, 9L)), 
class = "data.frame", row.names = c(NA, 
-8L))

谢谢你,akrun。你能描述一个数据规范化很重要的场景吗?只需要你脑海中的一个实际场景即可。 - TarJae
1
@TarJae 当不同变量之间的数量差异较大时,具有较高值的变量可能会倾斜所建立的模型。 - akrun

2
一个基本的R选项。
transform(
  df,
  Data_normalize = ave(Data,
    Name,
    FUN = function(x) (x - min(x)) / diff(range(x)) * 2 - 1
  )
)

提供

  Name Data Data_normalize
1    A    5      0.7777778
2    A    6      1.0000000
3    A   -1     -0.5555556
4    A   -3     -1.0000000
5    B    6      0.4000000
6    B    2     -0.4000000
7    B   -1     -1.0000000
8    B    9      1.0000000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接