分组归一化

6
我将尝试通过项目对 StrengthCode 进行标准化。
例如:
ID    Item    StrengthCode
7     A       1
7     A       5
7     A       7
8     B       1
8     B       3
9     A       5
9     A       3

我需要实现的是这样的功能:
ID    Item    StrengthCode    Nor
7     A       1    0.14
7     A       5    0.71
7     A       7    1
8     B       1    0.34
8     B       3    1
9     A       5    0.71
9     A       3    0.42

我尝试了这段代码,但是我卡住了……如果您能帮忙就太棒了!!!

normalit <- function(m){(m - min(m))/(max(m)-min(m))}

Tbl.Test <- Tbl.3.1 %>%
  group_by(ID, Item) %>%
  mutate(Nor = normalit(StregthCode))

我遇到了这个错误:

警告信息:NAs introduced by coercion

该错误通常表示在数据类型转换时出现了问题。

我没有得到相同的结果,但这个函数在你发布的示例数据上对我有效。 - Sotos
@Seb 你有没有任何一组数值,其中最大值和最小值重合的? - R18
df$StrengthCode 是一个因子吗? - jogo
2个回答

11

您期望的输出似乎是这样的:

df <- read.table(header=TRUE, text=
'ID    Item    StrengthCode
7     A       1
7     A       5
7     A       7
8     B       1
8     B       3
9     A       5
9     A       3')
df$Nor <- ave(df$StrengthCode, df$Item, FUN=function(x) x/max(x)) 
df
# > df
#   ID Item StrengthCode       Nor
# 1  7    A            1 0.1428571
# 2  7    A            5 0.7142857
# 3  7    A            7 1.0000000
# 4  8    B            1 0.3333333
# 5  8    B            3 1.0000000
# 6  9    A            5 0.7142857
# 7  9    A            3 0.4285714

使用dplyr可以完成以下操作(感谢Sotos的评论+代码):

library("dplyr")
(df %>% group_by(Item) %>% mutate(Nor = StrengthCode/max(StrengthCode))) 
# > (df %>% group_by(Item) %>% mutate(Nor = StrengthCode/max(StrengthCode)))
# Source: local data frame [7 x 4]
# Groups: Item [2]
# 
#      ID   Item StrengthCode       Nor
#   <int> <fctr>        <int>     <dbl>
# 1     7      A            1 0.1428571
# 2     7      A            5 0.7142857
# 3     7      A            7 1.0000000
# 4     8      B            1 0.3333333
# 5     8      B            3 1.0000000
# 6     9      A            5 0.7142857
# 7     9      A            3 0.4285714

2
不错的发现。你应该添加 dplyr 来处理 OP 的请求 (df %>% group_by(ID, Item) %>% mutate(new = StrengthCode/max(StrengthCode)))。 - Sotos
嗯...这很奇怪,只需按项目分组,而不是ID。 - Sotos
2
确实...星期五总是犯这种错误的好日子 :p - Sotos
太棒了,你真是太厉害了!谢谢!救了我的星期五,现在我可以去参加派对了,哈哈! - Seb
@jogo 有没有想过如果使用 mutate_at 进行归一化,每个特征会如何改变? - msoderstrom
@MartinSöderström 就像对每一列使用标准化函数的 lapply() 函数那样。 - jogo

4
同样也可以在data.table中轻松完成。
library(data.table)
setDT(df)[, Nor := StrengthCode / max(StrengthCode), by = Item]

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