晚上好,
我还是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是我感兴趣的参数。不幸的是,无论样本和组如何,整个参数的min
和max
都需要min
和max
。我也尝试子集,但这意味着为每个Sample创建一个子集,然后在图中将它们合并在一起。我也尝试使用group_by(Sample, Group)
,如RStudio cheatsheet中所述,但我无法将normalize函数应用于生成的数据框。
tl; dr我的问题是:如何在每个样本中,从0到1进行标准化,我的值?
提前感谢您的回答。
此致
答案 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)
以下是使用dplyr
和normalize
功能的另一种方法。我把它应用到我创建的玩具数据上没有任何问题。
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