мутировать для переменного числа столбцов - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть фрейм данных с переменным количеством столбцов (импорт .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 голосов
/ 18 сентября 2018

Вы можете использовать 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

DATA

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)
...