将特定变量的NA替换为特定值

时间:2018-11-30 08:02:28

标签: r na missing-data

我有一个看起来像

的数据集
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相同的记录的appliance_name来填充sysid。例如,记录02.03.18 14 bcfw5678 NA的NA应该替换为silverstar erp30i,因为从其他记录中可以明显看出,这个特定的sysid属于silverstar erp30i。我不能使用do.locf,因为前一条记录可能属于另一个设备组。

在这种情况下,如何治疗NA?

1 个答案:

答案 0 :(得分:0)

一种解决方法是将NA替换为每个组(sysid)中的第一个非NA值。

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