【问题标题】:how to add empty or NA row when condition is met满足条件时如何添加空行或 NA 行
【发布时间】:2018-06-25 19:46:24
【问题描述】:

我有以下 data.frame here。在CYC 列中,我有一个属于ID 列的序列。当ID 列中的名称更改时,CYC 列中的序列以1 开头。我的问题是:当序列以2 开头时,如何在2 上方插入带有NA's 的行?如果序列以33 NA 行开头,如果序列以4 开头,则此解决方案应该足够健壮以处理插入两个NA 行,依此类推。是否可以将ID 列中的样本名称添加到插入的NA 行中以填充CYC 列中序列的开头? CYC 列的预期结果示例如下:

   CYC
1   NA
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
10  10
11  11
12  12
13  13
14  14
15  15

【问题讨论】:

  • 你能举一个你想要的输出的例子吗?
  • @CDoug 我刚刚添加了一个预期的结果。

标签: r


【解决方案1】:

为了保持这种独立性,我们在末尾的注释中使用数据DF,由THB381 行组成。

我们使用by 处理每个ID 分别生成一个数据帧,其中IDCYC 从1 到最后一个CYC 用于那个ID。然后rbind将这样产生的数据帧一起。最后,我们将其与原始数据框合并。不使用任何包。

merge(DF, 
      do.call("rbind", by(DF, DF$ID, with, data.frame(ID = ID[1], CYC = 1:tail(CYC, 1)))), 
      all = TRUE)

给予:

       ID CYC POS COUNTS2 CTIME_mins
1  THB381   1  NA      NA         NA
2  THB381   2  40     206   100.0297
3  THB381   3  40     212   100.0297
4  THB381   4  40     204   100.0296
5  THB381   5  40     186   100.0297
6  THB381   6  40     177   100.0297
7  THB381   7  40     195   100.0297
8  THB381   8  40     189   100.0130
9  THB381   9  40     195   100.0297
10 THB381  10  40     184   100.0297
11 THB381  11  40     209   100.0296
12 THB381  12  40     194   100.0297
13 THB381  13  40     197   100.0297
14 THB381  14  40     194   100.0297

注意

DF <- structure(list(ID = structure(c(9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 
9L, 9L, 9L, 9L, 9L), .Label = c("B1", "B2", "B3", "S1", "S2", 
"TCB995", "THB379", "THB380", "THB381", "THB382", "THB383", "THB384", 
"THB385", "THB386", "THB387", "THB388", "TPB166", "TPN270", "WSTD"
), class = "factor"), POS = c(40L, 40L, 40L, 40L, 40L, 40L, 40L, 
40L, 40L, 40L, 40L, 40L, 40L), CYC = 2:14, COUNTS2 = c(206L, 
212L, 204L, 186L, 177L, 195L, 189L, 195L, 184L, 209L, 194L, 197L, 
194L), CTIME_mins = c(100.02965, 100.02965, 100.02955, 100.02965, 
100.02965, 100.02965, 100.012983333333, 100.02965, 100.02965, 
100.02955, 100.02965, 100.02965, 100.02965)), .Names = c("ID", 
"POS", "CYC", "COUNTS2", "CTIME_mins"), row.names = 256:268, class = "data.frame")

【讨论】:

    【解决方案2】:
    library('tidyverse')
    
    df <- tribble(
           ~ID, ~CYC, ~COUNTS,
        'WSTD',    1,       1,
        'WSTD',    2,       2,
          'S1',    2,       3,
          'S1',    3,       4,
          'S1',    4,       5,
      'THB381',    3,       6
    )
    

    我们希望获得一个包含所有必需的 ID 和 CYC 组合的数据框。我们可以使用列表列和unnest

    cycs <- df %>%
      group_by(ID) %>%
      summarise(CYC = list(seq_len(max(CYC)))) %>%
      unnest
    

    然后只需将 right_join 它添加到原始数据框,缺失的行将用 NAs 填充。

    right_join(df, cycs)
    #> Joining, by = c("ID", "CYC")
    #> # A tibble: 9 x 3
    #>       ID   CYC COUNTS
    #>    <chr> <dbl>  <dbl>
    #> 1     S1     1     NA
    #> 2     S1     2      3
    #> 3     S1     3      4
    #> 4     S1     4      5
    #> 5 THB381     1     NA
    #> 6 THB381     2     NA
    #> 7 THB381     3      6
    #> 8   WSTD     1      1
    #> 9   WSTD     2      2
    

    【讨论】:

    • @Paul 当我复制脚本时,我收到这条消息:Error in UseMethod("right_join") : no applicable method for 'right_join' applied to an object of class "function" 还有df &lt;- tribble (... 做什么?
    • 它适用于我的新会话。我认为它正在尝试使用 df 函数而不是数据框。您是否创建了 df 对象?
    • @Paul 我这样做了:data &lt;- read.csv("needed_columns.csv") 并在您的示例中将 df 替换为 data
    • @Paul 谢谢,现在我只得到错误:Joining, by = c("ID", "CYC") 在控制台中,当我写一个 right_joinn 的 csv 时,其中只有一个 x 出现。
    猜你喜欢
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2015-07-09
    • 2017-09-15
    • 2021-10-15
    • 2021-05-13
    • 1970-01-01
    相关资源
    最近更新 更多