繁体   English   中英

创建一个使用dplyr按组进行规范化的新列

[英]Create a new column that normalizes by groups using dplyr

我有这样的df:

Level <- c('Level_1A','Level_1B','Level_1B','Level_1C','Level_1A','Level_1A','Level_1B','Level_1C','Level_1C')
PT <- c(50,100,150,20,30,40,60,80,90)
df <- data.frame(Level,PT)

我正在尝试在df中创建一个新列,该列已将列PT的值标准化,并按级别进行分组

我想要的输出是

     Level  PT   NORM
1 Level_1A  50 1.0000
2 Level_1B 100 0.4444
3 Level_1B 150 1.0000
4 Level_1C  20 0.0000
5 Level_1A  30 0.0000
6 Level_1A  40 0.5000
7 Level_1B  60 0.0000
8 Level_1C  80 0.8571
9 Level_1C  90 1.0000

我试图做这样的事情,但它没有按预期工作。

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

df$NORM <- df %>%
  group_by(Level) %>%
  summarise(PT = normalit(PT))

请提供一些意见。

最后一行应该是mutate(NORM = normalit(PT))而不是summarise() ,并且赋值应该是df <- not df$NORM <-

df <- df %>%
    group_by(Level) %>%
    mutate(NORM = normalit(PT))

但是你也可以通过使用magrittr复合赋值运算符来避免使用df <- df ... 这会将df到表达式中,并且还可以一次性更新df

library(magrittr)
df %<>%
    group_by(Level) %>%
    mutate(NORM = normalit(PT))

两者都会给df as

     Level    PT      NORM
    (fctr) (dbl)     (dbl)
1 Level_1A    50 1.0000000
2 Level_1B   100 0.4444444
3 Level_1B   150 1.0000000
4 Level_1C    20 0.0000000
5 Level_1A    30 0.0000000
6 Level_1A    40 0.5000000
7 Level_1B    60 0.0000000
8 Level_1C    80 0.8571429
9 Level_1C    90 1.0000000

你在评论中询问data.table ,所以这里的代码是这样做的。

library(data.table)
setDT(df)[, NORM := normalit(PT), by = Level]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM