我有一些琼脂糖凝胶带迁移数据,我想在从控制泳道到处理泳道的分配值方面实现过程自动化。我从带检测软件中得到的数据看起来像这样:
Lane Band.No. Band.Label Relative.Front
17 2 1 Wellctrl 0.057569
18 2 2 Targetctrl 0.351812
19 3 1 Well 0.066098
20 3 2 Target 0.353945
21 4 1 Well 0.063966
22 4 2 Target 0.358209
23 5 1 Well 0.059829
24 5 2 Target 0.361111
25 6 1 Well 0.068376
26 6 2 Target 0.363248
27 7 1 Well 0.064103
28 7 2 Target 0.361111
29 8 1 Well 0.070513
30 8 2 Target 0.358974
31 9 1 Wellctrl 0.074786
32 9 2 Targetctrl 0.358974
33 10 1 Well 0.053419
34 10 2 Target 0.356838
35 11 1 Well 0.061966
36 11 2 Target 0.356838
37 12 1 Well 0.061966
38 12 2 Target 0.354701
39 13 1 Well 0.062098
40 13 2 Target 0.349036
41 13 3 NonTarget 0.576017
42 14 1 Well 0.059957
43 14 2 Target 0.344754
44 14 3 NonTarget 0.580300
45 15 1 Well 0.062098
46 15 2 Target 0.342612
47 15 3 NonTarget 0.573876
48 16 1 Well 0.059957
49 16 2 Target 0.338330
我想要实现的是拥有一个函数,可以逐行遍历我的数据框,并筛选 Band.Label 列和标签“Targetctrl”的屏幕,如果检测到,它会使用relative.front 列中的值创建一个变量并将其连续分配到新列中,直到变量被再次满足“Targetctrl”条件重写,结果如下:
Lane Band.No. Band.Label Relative.Front New
17 2 1 Wellctrl 0.057569 0.057569/NA
18 2 2 Targetctrl 0.351812 0.351812
19 3 1 Well 0.066098 0.351812
20 3 2 Target 0.353945 0.351812
21 4 1 Well 0.063966 0.351812
22 4 2 Target 0.358209 0.351812
23 5 1 Well 0.059829 0.351812
24 5 2 Target 0.361111 0.351812
25 6 1 Well 0.068376 0.351812
26 6 2 Target 0.363248 0.351812
27 7 1 Well 0.064103 0.351812
28 7 2 Target 0.361111 0.351812
29 8 1 Well 0.070513 0.351812
30 8 2 Target 0.358974 0.351812
31 9 1 Wellctrl 0.074786 0.351812
32 9 2 Targetctrl 0.358974 0.358974
33 10 1 Well 0.053419 0.358974
34 10 2 Target 0.356838 0.358974
35 11 1 Well 0.061966 0.358974
36 11 2 Target 0.356838 0.358974
37 12 1 Well 0.061966 0.358974
38 12 2 Target 0.354701 0.358974
39 13 1 Well 0.062098 0.358974
40 13 2 Target 0.349036 0.358974
41 13 3 NonTarget 0.576017 0.358974
42 14 1 Well 0.059957 0.358974
43 14 2 Target 0.344754 0.358974
44 14 3 NonTarget 0.580300 0.358974
45 15 1 Well 0.062098 0.358974
46 15 2 Target 0.342612 0.358974
47 15 3 NonTarget 0.573876 0.358974
48 16 1 Well 0.059957 0.358974
49 16 2 Target 0.338330 0.358974
我对 R 还比较陌生,所以还没有取得很大进展。我认为这需要利用某种形式的
ifelse
组件,但如果我理解正确的话,就无法在 ifelse
函数中分配变量。
我已经了解了这么多:
> testfunction<- function(x) {
ifelse (x["Band.Label"] == "Targetctrl", x["Relative.Front"], NA)
}
> apply(data, 1, testfunction)
预期输出为:
17 18 19 20 21 22
NA "0.351812" NA NA NA NA
23 24 25 26 27 28
NA NA NA NA NA NA
29 30 31 32 33 34
NA NA NA "0.358974" NA NA
35 36 37 38 39 40
NA NA NA NA NA NA
41 42 43 44 45 46
NA NA NA NA NA NA
47 48 49
NA NA NA
我想这里也可以利用失败的条件来插入变量,但此时非常困惑如何从
x["Relative.Front"]
通道引用 Targetctrl
值。
一种方法是使用
ifelse
然后使用 tidyr::fill
:
library(dplyr); library(tidyr)
mutate(df, New=ifelse(Band.Label=="Targetctrl", Relative.Front, NA)) |>
fill(New)
# A tibble: 19 × 5
Lane Band.No Band.Label Relative.Front New
<dbl> <dbl> <chr> <dbl> <dbl>
1 2 1 Wellctrl 0.0576 NA
2 2 2 Targetctrl 0.352 0.352
3 3 1 Well 0.0661 0.352
4 3 2 Target 0.354 0.352
5 4 1 Well 0.0640 0.352
6 4 2 Target 0.358 0.352
7 5 1 Well 0.0598 0.352
8 5 2 Target 0.361 0.352
9 6 1 Well 0.0684 0.352
10 6 2 Target 0.363 0.352
11 7 1 Well 0.0641 0.352
12 7 2 Target 0.361 0.352
13 8 1 Well 0.0705 0.352
14 8 2 Target 0.359 0.352
15 9 1 Wellctrl 0.0748 0.352
16 9 2 Targetctrl 0.359 0.359
17 10 1 Well 0.0534 0.359
18 10 2 Target 0.357 0.359
19 11 1 Well 0.0620 0.359
数据:
structure(list(Lane = c(2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8,
8, 9, 9, 10, 10, 11), Band.No = c(1, 2, 1, 2, 1, 2, 1, 2, 1,
2, 1, 2, 1, 2, 1, 2, 1, 2, 1), Band.Label = c("Wellctrl", "Targetctrl",
"Well", "Target", "Well", "Target", "Well", "Target", "Well",
"Target", "Well", "Target", "Well", "Target", "Wellctrl", "Targetctrl",
"Well", "Target", "Well"), Relative.Front = c(0.057569, 0.351812,
0.066098, 0.353945, 0.063966, 0.358209, 0.059829, 0.361111, 0.068376,
0.363248, 0.064103, 0.361111, 0.070513, 0.358974, 0.074786, 0.358974,
0.053419, 0.356838, 0.061966)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -19L))
使用
New
和 dplyr::mutate
创建一个 if_else
列并填写值。
尝试:
library(tidyverse)
new_df <- my_df %>%
mutate(
New = if_else(
Band.Label == "Targetctrl",
Relative.Front,
NA_real_)) %>%
fill(New, .direction = "down")
输出:
> new_df
# A tibble: 33 × 5
Lane Band.No. Band.Label Relative.Front New
<dbl> <dbl> <chr> <dbl> <dbl>
1 2 1 Wellctrl 0.0576 NA
2 2 2 Targetctrl 0.352 0.352
3 3 1 Well 0.0661 0.352
4 3 2 Target 0.354 0.352
5 4 1 Well 0.0640 0.352
6 4 2 Target 0.358 0.352
7 5 1 Well 0.0598 0.352
8 5 2 Target 0.361 0.352
9 6 1 Well 0.0684 0.352
10 6 2 Target 0.363 0.352
11 7 1 Well 0.0641 0.352
12 7 2 Target 0.361 0.352
13 8 1 Well 0.0705 0.352
14 8 2 Target 0.359 0.352
15 9 1 Wellctrl 0.0748 0.352
16 9 2 Targetctrl 0.359 0.359
17 10 1 Well 0.0534 0.359
18 10 2 Target 0.357 0.359
19 11 1 Well 0.0620 0.359
20 11 2 Target 0.357 0.359
21 12 1 Well 0.0620 0.359
22 12 2 Target 0.355 0.359
23 13 1 Well 0.0621 0.359
24 13 2 Target 0.349 0.359
25 13 3 NonTarget 0.576 0.359
26 14 1 Well 0.0600 0.359
27 14 2 Target 0.345 0.359
28 14 3 NonTarget 0.580 0.359
29 15 1 Well 0.0621 0.359
30 15 2 Target 0.343 0.359
31 15 3 NonTarget 0.574 0.359
32 16 1 Well 0.0600 0.359
33 16 2 Target 0.338 0.359
样本数据为:
my_df <- tibble::tribble(
~Lane, ~Band.No., ~Band.Label, ~Relative.Front,
2, 1, "Wellctrl", 0.057569,
2, 2, "Targetctrl", 0.351812,
3, 1, "Well", 0.066098,
3, 2, "Target", 0.353945,
4, 1, "Well", 0.063966,
4, 2, "Target", 0.358209,
5, 1, "Well", 0.059829,
5, 2, "Target", 0.361111,
6, 1, "Well", 0.068376,
6, 2, "Target", 0.363248,
7, 1, "Well", 0.064103,
7, 2, "Target", 0.361111,
8, 1, "Well", 0.070513,
8, 2, "Target", 0.358974,
9, 1, "Wellctrl", 0.074786,
9, 2, "Targetctrl", 0.358974,
10, 1, "Well", 0.053419,
10, 2, "Target", 0.356838,
11, 1, "Well", 0.061966,
11, 2, "Target", 0.356838,
12, 1, "Well", 0.061966,
12, 2, "Target", 0.354701,
13, 1, "Well", 0.062098,
13, 2, "Target", 0.349036,
13, 3, "NonTarget", 0.576017,
14, 1, "Well", 0.059957,
14, 2, "Target", 0.344754,
14, 3, "NonTarget", 0.5803,
15, 1, "Well", 0.062098,
15, 2, "Target", 0.342612,
15, 3, "NonTarget", 0.573876,
16, 1, "Well", 0.059957,
16, 2, "Target", 0.33833
)