如何解决使用R在汇总功能中使用mutate
identifier date from to type shift_back_max shift_forward_max
<chr> <date> <date> <date> <chr> <dbl> <dbl>
11 2011-12-31 2011-01-01 2011-12-31 last 364 0
11 2009-07-11 2009-01-01 2009-12-31 last 191 173
11 NA NA NA last NA NA
11 2013-05-21 2013-01-01 2013-12-31 last 140 224
11 2017-06-06 2017-01-01 2017-12-31 last 156 208
12 2014-04-03 2014-01-01 2014-12-31 NA 92 272
12 2016-08-04 2016-01-01 2016-12-31 NA 216 149
12 2014-03-05 2014-01-01 2014-12-31 NA 63 301
13 2011-02-07 2011-01-01 2011-12-31 NA 37 327
14 2014-04-04 2014-01-01 2014-12-31 first 93 271
14 2011-01-01 2011-01-01 2011-12-31 first 0 364
14 2016-06-21 2016-01-01 2016-12-31 first 172 193
16 NA NA NA NA NA NA
17 NA NA NA NA NA NA
18 NA NA NA NA NA NA
19 NA NA NA NA NA NA
我正在尝试以下情况
场景-1(跨stmt使用mutate)
data %>%
group_by(identifier) %>%
summarize(shift_back_max = - min(shift_back_max,na.rm = TRUE),shift_forward_max = min(shift_forward_max,mutate(across(starts_with("shift"),~ ifelse(is.infinite(.x),30 * sign(.x),.x))))
方案-2(不跨stmt使用mutate)
data %>%
group_by(identifier) %>%
summarize(shift_back_max = - min(shift_back_max,across(starts_with("shift"),.x)))
两种情况下产生的输出都相同,如下所示。那么跨stmt的mutate stmt有什么用?您能否让我知道这是不好的编程习惯,还是在任何特定情况下都会产生错误的输出?我使用across stmt
将-Inf
替换为-30
,将Inf
替换为30
。我已经对数百万条记录的数据采用了方案2,并进行了此操作。我可能不得不重新运行,因为它可能输出错误或只是一种不好的编程习惯?
这两种情况中哪一种是正确的?这是否意味着其他情况可能会产生不正确的输出?能帮我吗?
解决方法
我发现mutate内部摘要的使用非常令人困惑,并且并不真正知道该期待什么(老实说,它甚至可以工作)。如果我理解正确,则最好将您要执行的操作表示为(场景-3 ):
data %>%
group_by(identifier) %>%
summarize(shift_back_max = - min(shift_back_max,na.rm = TRUE),shift_forward_max = min(shift_forward_max,na.rm = TRUE)) %>%
ungroup() %>%
mutate(across(starts_with("shift"),~ ifelse(is.infinite(.x),30 * sign(.x),.x))))
(意味着您首先按标识符进行汇总,然后对整个结果进行处理)
您可以使用all.equal()
比较不同方法的结果。我希望所有这些方法都能得出相同的结果,但对读者来说并不清楚。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。