按级别标准化数据框

时间:2017-03-28 20:31:07

标签: r excel

晚上好,

我还是R的新手,如果这个问题对您来说显而易见,请提前抱歉。 我目前正在研究药物筛选方案,我在Excel中使用我的分析输出创建了.csv表。我将其作为数据框raw.data导入到R中,具有以下结构:

| Sample        | Group | Parameter Drug 1 | Parameter Drug 2 | Time Parameter Drug 1 (ms) |
|---------------|-------|------------------|------------------|----------------------------|
| Heart_Sample1 | Heart | 2.4              | 9.0              | 1.5                        |
| Heart_Sample1 | Heart | 2.29             | 22.2             | 3.4                        |
| Heart_Sample1 | Heart | 3.4              | 3.5              | 4.5                        |
| Heart_Sample1 | Heart | 5.2              | 8.4              | 6.5                        |
| Heart_Sample1 | Heart | 2.3              | 34.1             | 7.8                        |
| ...           | Organ | value            | value            | time                       |
| Heart_Sample2 | Heart | 10.4             | 10.2             | 1.5                        |
| Heart_Sample2 | Heart | 8.4              | 2.45             | 3.6                        |
| ...           | Organ | value            | value            | time                       |
| Liver_Sample1 | Liver | 13.4             | 44.5             | 2.8                        |
| ...           | Organ | 2.3              | value            | time                       |

参数表示我通过实验测量的某个参数的值(例如神经元尖峰)。参数时间表示峰值发生的记录时间。

我使用以下公式将raw.data转换为mod.data gather

  mod.data <- gather(raw.data, `Parameter Drug 1`, `Parameter Drug 2`, `Parameter Drug 3`, key = "Drug", value = "value")




| Sample        | Group | Time Parameter Drug 1 (ms) | Drug            | value |
|---------------|-------|----------------------------|-----------------|-------|
| Heart_Sample1 | Heart |                            | Baseline        |       |
| Heart_Sample1 | Heart |                            | Baseline        |       |
| Heart_Sample1 | Heart |                            | Concentration 1 |       |
| Heart_Sample1 | Heart |                            | Concentration 1 |       |
| Heart_Sample1 | Heart |                            | Concentration 2 |       |

然后我生成了样本,用Sample分隔,以便在所有样本中清楚地概览参数随时间发生的变化。结果是一个巨大的绘图数组,有大约200个图。

由于不同的器官具有不同的值,并且在同一器官内我可以找到非常不同的值,因此必须在每个样本中匹配量表以清楚地了解样本中的内容。

然后我尝试使用以下函数进行标准化:

    normalize <- function(x){
  (x - min(x))/(max(x)-min(x))
  } 

其中x是我感兴趣的参数。不幸的是,无论样本和组如何,整个参数的minmax都需要minmax。我也尝试子集,但这意味着为每个Sample创建一个子集,然后在图中将它们合并在一起。我也尝试使用group_by(Sample, Group),如RStudio cheatsheet中所述,但我无法将normalize函数应用于生成的数据框。

tl; dr我的问题是:如何在每个样本中,从0到1进行标准化,我的值?

提前感谢您的回答。

此致

2 个答案:

答案 0 :(得分:0)

使用data.table您可以使用以下方法解决此问题。

玩具示例:

library(data.table)
normalize <- function(x){
  (x - min(x))/(max(x)-min(x))
} 

df <- data.table(group = c(1, 1, 1, 1, 2, 2, 2), measure = c(10, 20, 0, 2, 1, 1, 10))
df[, measure_normalized := normalize(measure), by = group]

答案 1 :(得分:0)

以下是使用dplyrnormalize功能的另一种方法。我把它应用到我创建的玩具数据上没有任何问题。

library(dplyr)

set.seed(123)

df <- data.frame(Sample = sample(c("Sample1", "Sample2"), 20, replace = T),
                 Group = sample(c("Heart", "Liver"), 20, replace = T),
                 Time = sample(100:500, 20),
                 Value = sample(1000:5000, 20))

normalize <- function(x){
  (x - min(x))/(max(x)-min(x))
} 

df %>%
  group_by(Sample, Group) %>%
  mutate(Time_std = normalize(Time),
         Value_std = normalize(Value)) %>%
  arrange(Sample, Group, Time_std)

  #  Sample  Group  Time Value   Time_std  Value_std
  # Sample1  Heart   317  2895 0.00000000 0.47500000
  # Sample1  Heart   389  3441 0.57600000 1.00000000
  # Sample1  Heart   436  2755 0.95200000 0.34038462
  # Sample1  Heart   442  2401 1.00000000 0.00000000
  # Sample1  Liver   149  2513 0.00000000 0.00000000
  # Sample1  Liver   154  2792 0.01428571 0.24303136
  # Sample1  Liver   157  3661 0.02285714 1.00000000
  # Sample1  Liver   272  3510 0.35142857 0.86846690
  # Sample1  Liver   499  2535 1.00000000 0.01916376
  # Sample2  Heart   179  1877 0.00000000 0.15939905
  # Sample2  Heart   204  4171 0.39062500 1.00000000
  # Sample2  Heart   243  1442 1.00000000 0.00000000
  # Sample2  Liver   117  4011 0.00000000 0.92470805
  # Sample2  Liver   147  1002 0.10238908 0.00000000
  # Sample2  Liver   160  4256 0.14675768 1.00000000
  # Sample2  Liver   192  4236 0.25597270 0.99385372
  # Sample2  Liver   246  2096 0.44027304 0.33620160
  # Sample2  Liver   265  1379 0.50511945 0.11585741
  # Sample2  Liver   283  4244 0.56655290 0.99631223
  # Sample2  Liver   410  3832 1.00000000 0.86969883