我有一个具有可变列数的数据框(.csv导入)。第1列始终是相同的(时间码),第2列始终存在,而其他列可能存在或不存在(因此有2列或 i 列)。第2列- n 显示了机器能耗的仪表读数。有时值会丢失。我想对那些缺失的值进行插值。
df:
time maschine1 maschine 2 maschine 3 ...
16:15 7960 8237 9475 ...
16:20 10480 10757 11995 ...
16:25 NA NA NA ...
16:30 15520 15797 17035 ...
16:35 18160 18437 19675 ...
这就是我要尝试的:
for(i in 2:ncol(df)) {
df <- df %>%
mutate(maschine_[i]_interpolated = (ifelse(is.na(.[[i]]),(lag(df[[i]])+lead(df[[i]))/2, .[[i]])))
}
因此,我想对每个 i 插入到 n 机械的插值值并将其写入新列。
有什么想法吗?提前非常感谢!
答案 0 :(得分:1)
您可以按照注释中的建议使用mutate_at
。对于线性插值,可以使用na.interpolation
包中的imputeTS
。
library(dplyr)
library(imputeTS)
dat2 <- dat %>% mutate_at(vars(-time), funs(Inter = na.interpolation(.)))
dat2
# time maschine1 maschine2 maschine3 maschine1_Inter maschine2_Inter maschine3_Inter
# 1 16:15 7960 8237 9475 7960 8237 9475
# 2 16:20 10480 10757 11995 10480 10757 11995
# 3 16:25 NA NA NA 13000 13277 14515
# 4 16:30 15520 15797 17035 15520 15797 17035
# 5 16:35 18160 18437 19675 18160 18437 19675
或者您可以使用lapply
。
dat3 <- dat
dat3[-1] <- lapply(dat[-1], na.interpolation)
dat4 <- dat3[-1]
names(dat4) <- paste(names(dat4), "Inter", sep = "_")
dat5 <- cbind(dat, dat4)
dat5
# time maschine1 maschine2 maschine3 maschine1_Inter maschine2_Inter maschine3_Inter
# 1 16:15 7960 8237 9475 7960 8237 9475
# 2 16:20 10480 10757 11995 10480 10757 11995
# 3 16:25 NA NA NA 13000 13277 14515
# 4 16:30 15520 15797 17035 15520 15797 17035
# 5 16:35 18160 18437 19675 18160 18437 19675
数据
dat <- read.table(text = "time maschine1 maschine2 maschine3
'16:15' 7960 8237 9475
'16:20' 10480 10757 11995
'16:25' NA NA NA
'16:30' 15520 15797 17035
'16:35' 18160 18437 19675",
header = TRUE, stringsAsFactors = FALSE)