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

标签 r 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 <-不是 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/

相关文章:

r - 如何使用 dplyr 或其他包合并两个数据帧?

r - 如何让 R 的 loess 和 R 的 lowess 函数给出相同的结果?

r - 按R中的所有列对数据框进行排序

r - 在 R 中使用 OR 而不是 AND 根据多个条件选择行

html - RSelenium:在文本框中输入值

r - 如何使用 MUTATE : growth rate? 添加新变量

r - 覆盖 dplyr 中的 "Variables not shown",以显示来自 df 的所有列

r - dplyr 通过评估查找单元格值来改变特定列

r - 组内唯一ID

r - 根据 R 数据集中的进一步观察创建变量