【问题标题】:Add data row(s) to a tibble depending on the content of a single column根据单个列的内容将数据行添加到小标题
【发布时间】:2019-06-20 19:39:51
【问题描述】:

我想根据tibble 列之一中存在的值自动向现有tibble 添加一行或多行。

数据

    A   B   C   D     E
1   1   1   1   5   7.81
2   1   1   1   4   13.12
3   1   1   1   5   3.39
4   1   1   1   4   3.28
5   1   1   1   5   2.69
6   1   1   1   2   5.70
7   1   1   1   1   8.22

如果“D”中缺少“3”,则预期输出

    A   B   C   D     E
1   1   1   1   5   7.81
2   1   1   1   4   13.12
3   1   1   1   5   3.39
4   1   1   1   4   3.28
5   1   1   1   5   2.69
6   1   1   1   2   5.70
7   1   1   1   1   8.22
8   1   1   1   3   0.00

tibbleD 中,值的范围应为1:5,具体取决于数据集。

我希望能够识别列D 中是否缺少此范围中的一个或多个数字,如果缺少一个值(例如3),我想添加一个新行来复制列中的数据@ 987654329@ 并在 D 列中输入 3,在 E 列中输入 0。如果缺少两个或多个值(例如 34)我想添加两行等。

【问题讨论】:

  • Data %>% complete(nesting(A,B,C), D = seq(min(D), max(D), 1L))

标签: r dplyr tidyverse tidyr


【解决方案1】:

你可以使用tidyr::complete:

library(tidyverse)

Data %>% 
     complete(nesting(A,B,C), D = seq(min(D), max(D), 1L))

#> # A tibble: 8 x 5
#>       A     B     C     D     E
#>   <int> <int> <int> <int> <dbl>
#> 1     1     1     1     1  8.22
#> 2     1     1     1     2  5.7 
#> 3     1     1     1     3 NA   
#> 4     1     1     1     4 13.1 
#> 5     1     1     1     4  3.28
#> 6     1     1     1     5  7.81
#> 7     1     1     1     5  3.39
#> 8     1     1     1     5  2.69

我建议不要使用0 而不是NA,但如果您想将它们添加到底部并将它们作为0,那么这样可以:

Data %>% 
     complete(nesting(A,B,C), D = seq(min(D), max(D), 1L)) %>% 
     arrange(is.na(E)) %>% 
     mutate(E = replace_na(E, 0))

#> # A tibble: 8 x 5
#>       A     B     C     D     E
#>   <int> <int> <int> <int> <dbl>
#> 1     1     1     1     1  8.22
#> 2     1     1     1     2  5.7 
#> 3     1     1     1     4 13.1 
#> 4     1     1     1     4  3.28
#> 5     1     1     1     5  7.81
#> 6     1     1     1     5  3.39
#> 7     1     1     1     5  2.69
#> 8     1     1     1     3  0

reprex package (v0.3.0) 于 2019 年 6 月 20 日创建

【讨论】:

  • 一个可能有点切题的问题。您的代码运行良好,但再往下一点,我还有一些其他代码计算了 D 列 times_entered = count(Data, D) %&gt;% select(n) 中每个值的出现次数,但这现在计算了新值。有没有办法像 E 列一样将此计数设置为 0?谢谢。
  • @Joe_Roberts Data %&gt;% complete(nesting(A,B,C), D = seq(min(D), max(D), 1L)) %&gt;% add_count(D) %&gt;% mutate(n=(!is.na(E))*n) %&gt;% group_by(D) %&gt;% summarise_at(vars(n),.funs = mean) %&gt;% pull(n) 只是一个涂鸦。可能会有更好的解决方案。
  • 不幸的是它仍然为 E 列返回 1 计数为 0.00 [1] 1 1 1 2 3!
  • @Joe_Roberts 看来您决定使用0 而不是NA 然后:Data %&gt;% complete(nesting(A,B,C), D = seq(min(D), max(D), 1L)) %&gt;% arrange(is.na(E)) %&gt;% mutate(E = replace_na(E, 0)) %&gt;% add_count(D) %&gt;% mutate(n=(E!=0)*n) %&gt;% group_by(D) %&gt;% summarise_at(vars(n),.funs = mean) %&gt;% pull(n)
  • 是的,对不起,我应该在之前的回复中提到这一点!新代码有效,非常感谢!顺便说一句,我能问一下你为什么不推荐使用0 而不是NA
猜你喜欢
  • 2020-09-04
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
相关资源
最近更新 更多