gpt4 book ai didi

r - 使用 dplyr 创建一个按组规范化的新列

转载 作者:行者123 更新时间:2023-12-04 02:16:06 24 4
gpt4 key购买 nike

我有一个这样的 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 <-不是 df$NORM <- .

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

但你也可以避免做 df <- df ...通过使用 magrittr 复合赋值运算符。这将管道 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]

关于r - 使用 dplyr 创建一个按组规范化的新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33556654/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com