用特定值替换特定变量的 NA

Replace NAs of a particular variable with a particular value

我有一个看起来像

的数据集
Date       temperature   sysid      appliance_name 
01.03.18   13            abcd123    silverstar 320
02.03.18   15            abcd123    silverstar 320
03.03.18   17            abcd123    silverstar 320
04.03.18   15            abcd123    silverstar 320
01.03.18   18            bcfw5678   silverstar erp30i
02.03.18   14            bcfw5678   NA
03.03.18   18            bcfw5678   silverstar erp30i
04.03.18   10            bcfw5678   silverstar erp30i
01.03.18   16            ygft3456   NA
02.03.18   13            ygft3456   silverstar 30i
03.03.18   12            ygft3456   silverstar 30i
04.03.18   18            ygft3456   silverstar 30i

我很清楚用相同的 appliance_name 填充 NA 与具有相同 sysid 的记录的 appliance_name 相同。例如,记录 02.03.18 14 bcfw5678 NA 应该将 NA 替换为 silverstar erp30i,因为从其他记录可以清楚地看出这个特定的 sysid 属于 silverstar erp30i。我不能使用 do.locf,因为之前的记录可能属于另一个设备组。

这种情况下NA的治疗方法有哪些?

处理此问题的一种方法是将 NA 替换为每个组中的第一个非 NA 值 (sysid)。

library(dplyr)

df %>%
  group_by(sysid) %>%
  mutate(appliance_name = replace(appliance_name, is.na(appliance_name), 
                        appliance_name[which.max(!is.na(appliance_name))]))



#    Date     temperature sysid    appliance_name  
#   <fct>          <int> <fct>    <fct>           
# 1 01.03.18          13 abcd123  silverstar320   
# 2 02.03.18          15 abcd123  silverstar320   
# 3 03.03.18          17 abcd123  silverstar320   
# 4 04.03.18          15 abcd123  silverstar320   
# 5 01.03.18          18 bcfw5678 silverstarerp30i
# 6 02.03.18          14 bcfw5678 silverstarerp30i
# 7 03.03.18          18 bcfw5678 silverstarerp30i
# 8 04.03.18          10 bcfw5678 silverstarerp30i
# 9 01.03.18          16 ygft3456 silverstar30i   
#10 02.03.18          13 ygft3456 silverstar30i   
#11 03.03.18          12 ygft3456 silverstar30i   
#12 04.03.18          18 ygft3456 silverstar30i