通过匹配dplyr中的组内的列来填充NAs

时间:2018-02-09 16:04:19

标签: r dplyr

我想用同一列中不同组的匹配值替换列中的NAs。

示例数据

data = data.frame(groupID = c(rep("A", 4), rep("B", 4)),
              date = seq(as.Date("2000-01-01"), by = "day", length.out = 4),
              value = c(1, 2, 3, NA, 7, NA, 9, 10))

# groupID date       value
# A       2000-01-01     1
# A       2000-01-02     2
# A       2000-01-03     3
# A       2000-01-04    NA
# B       2000-01-01     7
# B       2000-01-02    NA
# B       2000-01-03     9
# B       2000-01-04    10

value列缺少应由具有相同时间戳(来自date列)但来自另一组的数据填充的数据,即来自groupID {{的数据丢失1}}应替换为组A中的相应值,反之亦然。

所需输出

B

我尝试了什么

我试图保持我的数据整洁,但我想出的唯一工作方法是通过groupID传播数据,然后使用# groupID date value # A 2000-01-01 1 # A 2000-01-02 2 # A 2000-01-03 3 # A 2000-01-04 10 # B 2000-01-01 7 # B 2000-01-02 2 # B 2000-01-03 9 # B 2000-01-04 10 (或ifelse)变异,并再次收集数据,如下所示:

case_when

我想拥有什么

但是由于数据集中有> 2个组和要处理的> 1值列,我希望有一个替代方案,我可以在管道中的mutate调用中使用,而不需要扩展/收集步骤。

  • 一般来说,有没有办法按data %>% spread(., key = groupID, value = value) %>% mutate(., A = ifelse(is.na(A), B, A), B = ifelse(is.na(B), A, B)) %>% gather(., key = "groupID", value = "value", -date) 进行分组,然后与groupID或类似地调用mutate,其中RHS与case_when匹配value date }?
  • 更具体地说,是否有一种直接的方法可以使用mutate中的函数来指定groupID的首选排名来填充空白?比如说,我们有A,B,C,D组,A中缺少的值应首先由C组(如果可用)填充,然后由D组(如果可用)填充,而不是D组中的值?

0 个答案:

没有答案