我有一个数据集,看起来像
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的治疗方法是什么?
处理此问题的一种方法是用每组中的第一个非 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
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