【问题标题】:How to insert a place holder in a list, where pieces of data are missing using R?如何在列表中插入占位符,其中使用 R 缺少数据片段?
【发布时间】:2018-12-24 07:02:31
【问题描述】:

我有一组来自实验的数据需要分析。但是由于那里还有很多对我来说并不重要的数据,所以我想使用 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。你知道任何可能性吗,我该如何解决这个问题?

如果有人可以帮助我,我将非常感激!

【问题讨论】:

  • 仅与这个问题略有不同stackoverflow.com/questions/35131191/…
  • 使用library(tidyverse),你可以通过df_sorted %&gt;% complete(ImageNumber, FrameNumber) %&gt;% arrange(FrameNumber) %&gt;% mutate(FrameNumber = ifelse(is.na(Treatment), NA, FrameNumber))得到想要的输出。
  • @IceCreamToucan 这工作得很好!您想添加一个答案以便我选择吗?

标签: r list na


【解决方案1】:

这是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) 的值 - 在您的示例中,即从 110。参数 all.y = TRUE - 属于 merge - 将隐式缺失值转换为显式缺失值。

最后我们将列表组合回一个带有do.call(rbind, ...)的数据框。

【讨论】:

    猜你喜欢
    • 2019-03-30
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 2013-10-14
    • 1970-01-01
    • 2016-06-24
    相关资源
    最近更新 更多