改变列数
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]])))
}
所以我想在每个 i 到 n 机器的新列中插入和写入内插值。
有什么想法吗?非常感谢!
您可以按照评论中的建议使用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)
我有一个列数可变的数据框(.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 机器的新列中插入和写入内插值。
有什么想法吗?非常感谢!
您可以按照评论中的建议使用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)