改变列数

mutate for variable number of columns

我有一个列数可变的数据框(.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]])))
}

所以我想在每个 in 机器的新列中插入和写入内插值。

有什么想法吗?非常感谢!

您可以按照评论中的建议使用mutate_at。对于线性插值,您可以使用 imputeTS 包中的 na_interpolation

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)