当无法使用group_by时,对列进行突变以使其在组内的非NA值最少

我试图获取一列包含值和NA的数据,并用组中的最小值替换值。挑战在于,在这种情况下,我还没有找到使用group_by的方法,因为数据集中没有唯一的分组。

我要说的是:如果value列中的值是一个数字,请使用该数字,除非先前的值小于当前值。如果不是数字,则将值保留为NA。

我尝试了group_by,但意识到如上所述无法正常工作。然后我尝试了一个if_else,但是我认为这失败了,因为is.numeric没有向量化。

最终的数据框架是我要实现的目标。

示例数据

library(dplyr)

# Initial
initial <- structure(list(dates = structure(c(17532,17539,17546,17553,17560,17567,17574,17581,17588,17595,17602,17609,17616,17623,17630,17637,17644,17651,17658,17665,17672,17679
),class = "Date"),values = c(10,10,11,NA,20,21,22,30,31,NA)),class = "data.frame",row.names = c(NA,-22L))
# Final
final <- structure(list(dates = structure(c(17532,NA),desired = c(10,-22L))

此操作以及其他尝试均无效。我怀疑是因为is.numeric没有向量化。我也尝试了一些mutate_at版本,但也无法使其正常工作。

# Did not work
initial %>%
  mutate(desired = ifelse(is.numeric(values),ifelse(is.numeric(lag(values)),lag(values),values),values))
v0zhang 回答:当无法使用group_by时,对列进行突变以使其在组内的非NA值最少

我们可以使用data.table::rleid来创建组,并从每个组中选择min值。

library(dplyr)

initial %>%
  group_by(group = data.table::rleid(is.na(values))) %>%
  mutate(ans = min(values)) %>% 
  ungroup() %>%
  select(-group)

# A tibble: 22 x 3
#   dates      values   ans
#   <date>      <dbl> <dbl>
# 1 2018-01-01     10    10
# 2 2018-01-08     10    10
# 3 2018-01-15     10    10
# 4 2018-01-22     11    10
# 5 2018-01-29     NA    NA
# 6 2018-02-05     NA    NA
# 7 2018-02-12     NA    NA
# 8 2018-02-19     NA    NA
# 9 2018-02-26     NA    NA
#10 2018-03-05     20    20
# … with 12 more rows

对于纯dplyr解决方案,我们可以将group_by语句替换为

group_by(group = cumsum(is.na(values) != lag(is.na(values),default = FALSE))) %>%
本文链接:https://www.f2er.com/3130522.html

大家都在问