【问题标题】:Normalizing values depending on group in R [duplicate]根据R中的组对值进行归一化[重复]
【发布时间】:2021-02-28 15:46:33
【问题描述】:

我有这个数据集:

> head(meltCalcium)
  Time    Cell Intensity
1    1 IntDen1  306852.5
2    2 IntDen1  302892.2
3    3 IntDen1  298258.6
4    4 IntDen1  300769.9
5    5 IntDen1  301971.8
6    6 IntDen1  302585.6

> tail(meltCalcium)
      Time     Cell Intensity
32531  659 IntDen49  47788.16
32532  660 IntDen49  47560.32
32533  661 IntDen49  47738.24
32534  662 IntDen49  48968.96
32535  663 IntDen49  48796.16
32536  664 IntDen49  48156.80

我有 49 个单元格,每个单元格的时间达到 664。在这种情况下,时间并不重要,因为我想获得每个单元格的归一化强度(因此(强度 - 最小值)/(最大值 - 最小值)),并可能将其作为新列添加到数据框中。

我试过了

> meltCalcium$normalized <- with(meltCalcium, (Intensity - min(Intensity))/diff(range(Intensity)))

但是通过这种方式,最大值和最小值是使用所有单元的强度计算的。如何分别为每个单元格执行此操作?

谢谢!

【问题讨论】:

标签: r range max min normalize


【解决方案1】:

按组应用公式:

library(dplyr)
result <- meltCalcium %>%
           group_by(Cell) %>%
           mutate(normalized = (Intensity-min(Intensity))/diff(range(Intensity)))

【讨论】:

    【解决方案2】:

    基础 R 解决方案:

    normalise_vec_min_max <- function(num_vec){
      minnv <- min(num_vec, na.rm = TRUE)
      maxnv <- max(num_vec, na.rm = TRUE)
      return((num_vec - minnv) / (maxnv - minnv))
    }
    
    with(meltCalcium, ave(Intensity, Cell, FUN = normalise_vec_min_max))
    

    数据:

    meltCalcium <- structure(list(Time = c(1L, 2L, 3L, 4L, 5L, 6L, 659L, 660L, 661L, 
    662L, 663L, 664L), Cell = c("IntDen1", "IntDen1", "IntDen1", 
    "IntDen1", "IntDen1", "IntDen1", "IntDen49", "IntDen49", "IntDen49", 
    "IntDen49", "IntDen49", "IntDen49"), Intensity = c(306852.5, 
    302892.2, 298258.6, 300769.9, 301971.8, 302585.6, 47788.16, 47560.32, 
    47738.24, 48968.96, 48796.16, 48156.8)), row.names = c(NA, -12L
    ), class = "data.frame")
    

    【讨论】:

      猜你喜欢
      • 2016-03-09
      • 2013-06-19
      • 2015-05-01
      • 1970-01-01
      • 2016-12-16
      • 2014-09-03
      • 1970-01-01
      • 2014-07-18
      • 2017-09-15
      相关资源
      最近更新 更多