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

问题描述 投票:0回答:2

我有一个数据集,看起来像

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
来填充 NA。例如,记录
02.03.18   14  bcfw5678   NA
应该将 NA 替换为
silverstar erp30i
,因为从其他记录中可以清楚地看出,这个特定的
sysid
属于
silverstar erp30i
。我无法使用
do.locf
,因为之前的记录可能属于另一个设备组。

这种情况下NA的治疗方法是什么?

r na missing-data
2个回答
1
投票

处理此问题的一种方法是用每组中的第一个非 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   

0
投票

A

Base R
解决方案是:

数据

df <- structure(list(Date = c("01.03.18", "02.03.18", "03.03.18", "04.03.18", 
"01.03.18", "02.03.18", "03.03.18", "04.03.18", "01.03.18", "02.03.18", 
"03.03.18", "04.03.18"), temperature = c(13L, 15L, 17L, 15L, 
18L, 14L, 18L, 10L, 16L, 13L, 12L, 18L), sysid = c("abcd123", 
"abcd123", "abcd123", "abcd123", "bcfw5678", "bcfw5678", "bcfw5678", 
"bcfw5678", "ygft3456", "ygft3456", "ygft3456", "ygft3456"), 
    appliance_name = c("silverstar_320", "silverstar_320", "silverstar_320", 
    "silverstar_320", "silverstar_erp30i", NA, "silverstar_erp30i", 
    "silverstar_erp30i", NA, "silverstar_30i", "silverstar_30i", 
    "silverstar_30i")), class = "data.frame", row.names = c(NA, 
-12L))

程序

list1 <- by(df[,4], df[,3], function(x) unique(na.omit(x)))
df2 <- data.frame(names(list1), as.vector(list1))

df[is.na(df[,4]) == T, 4] <- df2[df2[,1] %in% df[is.na(df[,4]) == T,3], 2]

输出

       Date temperature    sysid    appliance_name
1  01.03.18          13  abcd123    silverstar_320
2  02.03.18          15  abcd123    silverstar_320
3  03.03.18          17  abcd123    silverstar_320
4  04.03.18          15  abcd123    silverstar_320
5  01.03.18          18 bcfw5678 silverstar_erp30i
6  02.03.18          14 bcfw5678 silverstar_erp30i
7  03.03.18          18 bcfw5678 silverstar_erp30i
8  04.03.18          10 bcfw5678 silverstar_erp30i
9  01.03.18          16 ygft3456    silverstar_30i
10 02.03.18          13 ygft3456    silverstar_30i
11 03.03.18          12 ygft3456    silverstar_30i
12 04.03.18          18 ygft3456    silverstar_30i
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.