R - 根据 ifelse 函数的结果为新变量赋值

问题描述 投票:0回答:2

我有一些琼脂糖凝胶带迁移数据,我想在从控制泳道到处理泳道的分配值方面实现过程自动化。我从带检测软件中得到的数据看起来像这样:

     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
值。

r if-statement
2个回答
1
投票

一种方法是使用

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))

0
投票

使用

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
  )
© www.soinside.com 2019 - 2024. All rights reserved.