变异为可变的列数

时间:2018-09-17 20:16:40

标签: r for-loop dplyr interpolation mutate

我有一个具有可变列数的数据框(.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 机械的插值值并将其写入新列。

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

1 个答案:

答案 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)