Как вставить заполнитель в список, где части данных отсутствуют с помощью R? - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть набор данных из эксперимента, которые я должен проанализировать.Но так как там также много данных, которые для меня не важны, я хотел бы привести в порядок эти файлы, используя R, так как это слишком много работы, чтобы делать вручную.Поскольку данные в этих файлах .csv имеют несвоевременные эксперименты, порядок различных измерений имеет значение, и разные числа должны быть в определенном порядке.

До сих пор мне уже удавалось выбрать всестолбцы, которые мне нужны, и отсортировать их по различным условиям, используя следующий код:

used_columns <- select(df,
                       ImageNumber,
                       FrameNumber,
                       Treatment,
                       Intensity1,
                       Intensity2)

used_columns.t <- as.tibble(used_columns)

df_sorted <- used_columns.t %>%
  filter(Treatment == "B2") %>%
  .[order(as.integer(.$FrameNumber),decreasing = FALSE), ]

Используя этот код, df_sorted выдает фрейм данных, который выглядит следующим образом:

ImageNumber FrameNumber Treatment   Intensity1  Intensity2
1           1           B2          1598,45         0,14
2           1           B2          930,40          0,11
3           1           B2          107,86          0,04
4           1           B2          881,09          0,11
7           1           B2          2201,98         0,15
8           1           B2          161,30          0,04
9           1           B2          1208,14         0,17
4           2           B2          831,75          0,12
5           2           B2          1027,41         0,14
7           2           B2          2052,16         0,15
8           2           B2          159,63          0,05
9           2           B2          1111,49         0,16
10          2           B2          1312,15         0,12
1           3           B2          863,79          0,10
2           3           B2          104,06          0,04
3           3           B2          816,02          0,11
4           3           B2          1053,02         0,14
5           3           B2          132,32          0,03
6           3           B2          2059,03         0,14
7           3           B2          153,49          0,04
8           3           B2          1118,69         0,15
9           3           B2          1632,66         0,18
10          3           B2          1302,15         0,12

Тем не менее, я хотел бы иметь такую ​​таблицу, где пропущенные значения обозначены как NA (или любой другой заполнитель):

ImageNumber FrameNumber Treatment   Intensity1  Intensity2
1           1           B2          1598,45         0,14
2           1           B2          930,40          0,11
3           1           B2          107,86          0,04
4           1           B2          881,09          0,11
5           NA          NA          NA              NA
6           NA          NA          NA              NA
7           1           B2          2201,98         0,15
8           1           B2          161,30          0,04
9           1           B2          1208,14         0,17
10          NA          NA          NA              NA
1           NA          NA          NA              NA
2           NA          NA          NA              NA
3           NA          NA          NA              NA
4           2           B2          831,75          0,12
5           2           B2          1027,41         0,14
6           NA          NA          NA              NA
7           2           B2          2052,16         0,15
8           2           B2          159,63          0,05
9           2           B2          1111,49         0,16
10          2           B2          1312,15         0,12
1           3           B2          863,79          0,10
2           3           B2          104,06          0,04
3           3           B2          816,02          0,11
4           3           B2          1053,02         0,14
5           3           B2          132,32          0,03
6           3           B2          2059,03         0,14
7           3           B2          153,49          0,04
8           3           B2          1118,69         0,15
9           3           B2          1632,66         0,18
10          3           B2          1302,15         0,12

Это просто очень короткий фрагмент таблицы, которую я имел, ина самом деле, в зависимости от состояния, ImageNumber может доходить до 1441. Знаете ли вы какую-либо возможность, как я мог бы решить эту проблему?

Я был бы очень признателен, если бы кто-нибудь мог помочь мне в этом!

1 Ответ

0 голосов
/ 23 декабря 2018

Вот подход разделения-применения-объединения в base R

out <- do.call(rbind,
               by(
                 data = df1,
                 INDICES = df1$FrameNumber,
                 FUN = merge,
                 y = data.frame(ImageNumber = seq(min(df1$ImageNumber), max(df1$ImageNumber))),
                 all.y = TRUE
               ))
out
#     ImageNumber FrameNumber Treatment Intensity1 Intensity2
#1.1            1           1        B2    1598,45       0,14
#1.2            2           1        B2     930,40       0,11
#1.3            3           1        B2     107,86       0,04
#1.4            4           1        B2     881,09       0,11
#1.5            5          NA      <NA>       <NA>       <NA>
#1.6            6          NA      <NA>       <NA>       <NA>
#1.7            7           1        B2    2201,98       0,15
#1.8            8           1        B2     161,30       0,04
#1.9            9           1        B2    1208,14       0,17
#1.10          10          NA      <NA>       <NA>       <NA>
#2.1            1          NA      <NA>       <NA>       <NA>
#2.2            2          NA      <NA>       <NA>       <NA>
#2.3            3          NA      <NA>       <NA>       <NA>
#2.4            4           2        B2     831,75       0,12
# ...

Мы разбиваем ваши данные на FrameNumber, объединяем каждый элемент списка с фреймом данных, который содержит один столбец с именем ImageNumber.Эти столбцы содержат значения от min(df1$ImageNumber) до max(df1$ImageNumber), то есть от 1 до 10 в вашем примере.Аргумент all.y = TRUE - принадлежащий merge - превращает неявные пропущенные значения в явные пропущенные значения.

Наконец, мы объединяем список обратно во фрейм данных с do.call(rbind, ...).

...