Как заполнить новый фрейм данных на основе существующего в цикле данных - PullRequest
0 голосов
/ 29 сентября 2019

Я хочу создать новый фрейм данных (b), рассчитав наклон нескольких интервалов во времени. Ниже приведено подмножество исходных данных (а) и код для генерации желаемого кадра данных (б). Я хочу определить наклон $ O2_229 и $ O2_Blank с интервалами $ RunTime 0.393-0.443, 0.000-0.042 и 0.042-0.093 соответственно.

Вот код, который я сейчас использую:

a <- structure(list(RunTime = c(0, 0.042, 0.093, 0.143, 0.193, 0.243, 
0.293, 0.343, 0.393, 0.443, 0.493, 0.543, 0.593, 0.643, 0.693, 
0.743, 0.793, 0.842, 0.893, 0.943), O2_229 = c(223.479, 222.774, 
222.185, 221.557, 221.335, 220.879, 220.734, 220.396, 220.295, 
219.996, 219.859, 219.407, 219.33, 218.899, 218.725, 218.495, 
218.449, 217.833, 217.805, 217.856), O2_35 = c(189.719, 189.479, 
189.063, 188.843, 188.498, 188.237, 188.262, 187.959, 187.856, 
187.786, 187.512, 187.086, 186.957, 186.874, 186.589, 186.559, 
186.312, 186.267, 186.039, 185.947), O2_230 = c(189.894, 189.326, 
188.835, 188.786, 188.296, 188.064, 187.634, 187.417, 187.001, 
187.024, 186.684, 186.488, 186.162, 185.956, 185.931, 185.701, 
185.604, 185.491, 185.22, 185.384), O2_36 = c(191.005, 190.59, 
190.155, 189.836, 189.505, 189.103, 188.751, 188.343, 188.183, 
187.785, 187.563, 187.442, 186.949, 186.684, 186.486, 186.215, 
185.942, 185.858, 185.689, 185.567), O2_Blank = c(193.543, 193.315, 
192.927, 192.846, 192.373, 191.749, 191.284, 190.876, 190.44, 
190.196, 189.89, 189.381, 189.131, 188.841, 188.647, 188.631, 
188.315, 188.358, 188.062, 188.221)), row.names = c(NA, 20L), class 
= "data.frame")

b <- data.frame("Light" = c("0%", "10%", "20%"),
            "229" = c((a$O2_229[a$RunTime == "0.443"] - 
a$O2_229[a$RunTime == "0.393"])/(0.443 - 0.393),
                      (a$O2_229[a$RunTime == "0.042"] - 
a$O2_229[a$RunTime == "0"])/(0.042 - 0),
                      (a$O2_229[a$RunTime == "0.093"] - 
a$O2_229[a$RunTime == "0.042"])/(0.093 - 0.042)),
            "Blank" = c((a$O2_Blank[a$RunTime == "0.443"] - 
a$O2_Blank[a$RunTime == "0.393"])/(102.643 - 92.043),
                      (a$O2_Blank[a$RunTime == "0.042"] - 
a$O2_Blank[a$RunTime == "0"])/(0.042 - 0),
                      (a$O2_Blank[a$RunTime == "0.093"] - 
a$O2_Blank[a$RunTime == "0.042"])/(0.093 - 0.042)))

Желаемый вывод - это кадр данных, который выглядит следующим образом:

Light 229           Blank
0%    -0.02820755   -0.02301887
10%   -16.78571429  -5.42857143
20%   -11.54901961  -7.60784314

1 Ответ

0 голосов
/ 30 сентября 2019

Я почти уверен, что мне чего-то не хватает: эти легкие проценты - почему вы используете эти значения для вычисления линии 0%, для меня загадка - но я думаю, что это масштабируемая стратегия, которую вы хотите использовать в любом случае:

  library(scales) # For percent()
  library(tidyverse)
  library(magrittr) # For pipe aliases like divide_by()
#> 
#> Attaching package: 'magrittr'
#> The following object is masked from 'package:purrr':
#> 
#>     set_names
#> The following object is masked from 'package:tidyr':
#> 
#>     extract

a <- structure(list(RunTime = c(0, 0.042, 0.093, 0.143, 0.193, 0.243, 
                                0.293, 0.343, 0.393, 0.443, 0.493, 0.543, 0.593, 0.643, 0.693, 
                                0.743, 0.793, 0.842, 0.893, 0.943), 
                    O2_229 = c(223.479, 222.774, 
                               222.185, 221.557, 221.335, 220.879, 220.734, 220.396, 220.295, 
                               219.996, 219.859, 219.407, 219.33, 218.899, 218.725, 218.495, 
                               218.449, 217.833, 217.805, 217.856), 
                    O2_35 = c(189.719, 189.479, 
                              189.063, 188.843, 188.498, 188.237, 188.262, 187.959, 187.856, 
                              187.786, 187.512, 187.086, 186.957, 186.874, 186.589, 186.559, 
                              186.312, 186.267, 186.039, 185.947), 
                    O2_230 = c(189.894, 189.326, 
                               188.835, 188.786, 188.296, 188.064, 187.634, 187.417, 187.001, 
                               187.024, 186.684, 186.488, 186.162, 185.956, 185.931, 185.701, 
                               185.604, 185.491, 185.22, 185.384), 
                    O2_36 = c(191.005, 190.59, 
                              190.155, 189.836, 189.505, 189.103, 188.751, 188.343, 188.183, 
                              187.785, 187.563, 187.442, 186.949, 186.684, 186.486, 186.215, 
                              185.942, 185.858, 185.689, 185.567), 
                    O2_Blank = c(193.543, 193.315, 
                                 192.927, 192.846, 192.373, 191.749, 191.284, 190.876, 190.44, 
                                 190.196, 189.89, 189.381, 189.131, 188.841, 188.647, 188.631, 
                                 188.315, 188.358, 188.062, 188.221)), 
               row.names = c(NA, 20L), class = "data.frame")

b <- a %>% 
  # Pre-compute this so it's no recomputed when each mutated variable uses it
  mutate(RunTimeDiff = diff(RunTime) %>% prepend(NA)) %>% 
  # Apply this slope-getting(?) function to each variable except RunTime and
  # its diff. var., which are dropped from the finished product
  transmute_at(vars(-RunTime, -RunTimeDiff), ~ {
    diff(.x) %>% 
      prepend(NA) %>% 
      divide_by(RunTimeDiff)
  }) %>% 
  # Drop all the O2_ prefixes, where present
  rename_all(str_remove, "O2_") %>% 
  # Build the Light percentage variable off the row numbers; row names are used
  # just because they get added to the left, where we want Light to be
  rownames_to_column("Light") %>% 
  mutate_at("Light", ~ {
    .x %>% as.numeric() %>% 
      subtract(1) %>% 
      divide_by(10) %>% 
      percent()
  })

b %>% as_tibble()
#> # A tibble: 20 x 6
#>    Light   `229`   `35`   `230`  `36`   Blank
#>    <chr>   <dbl>  <dbl>   <dbl> <dbl>   <dbl>
#>  1 0%     NA     NA      NA     NA     NA    
#>  2 10%   -16.8   -5.71  -13.5   -9.88  -5.43 
#>  3 20%   -11.5   -8.16   -9.63  -8.53  -7.61 
#>  4 30%   -12.6   -4.40   -0.98  -6.38  -1.62 
#>  5 40%    -4.44  -6.90   -9.8   -6.62  -9.46 
#>  6 50%    -9.12  -5.22   -4.64  -8.04 -12.5  
#>  7 60%    -2.90   0.5    -8.6   -7.04  -9.3  
#>  8 70%    -6.76  -6.06   -4.34  -8.16  -8.16 
#>  9 80%    -2.02  -2.06   -8.32  -3.20  -8.72 
#> 10 90%    -5.98  -1.40    0.460 -7.96  -4.88 
#> 11 100%   -2.74  -5.48   -6.8   -4.44  -6.12 
#> 12 110%   -9.04  -8.52   -3.92  -2.42 -10.2  
#> 13 120%   -1.54  -2.58   -6.52  -9.86  -5.   
#> 14 130%   -8.62  -1.66   -4.12  -5.3   -5.80 
#> 15 140%   -3.48  -5.70   -0.500 -3.96  -3.88 
#> 16 150%   -4.60  -0.6    -4.6   -5.42  -0.320
#> 17 160%   -0.920 -4.94   -1.94  -5.46  -6.32 
#> 18 170%  -12.6   -0.918  -2.31  -1.71   0.878
#> 19 180%   -0.549 -4.47   -5.31  -3.31  -5.80 
#> 20 190%    1.02  -1.84    3.28  -2.44   3.18

Создано в 2019-09-29 пакетом представить (v0.3.0)

Это было бы чистоТидиверс подход, по крайней мере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...