我有这样的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))
请提供一些意见。
答案 0 :(得分:4)
最后一行应为mutate(NORM = normalit(PT))
而不是summarise()
,作业应为df <-
而不是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
作为
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]