Итак, я не совсем понимаю, что вы пытаетесь здесь сделать, и это нормально; Я достаточно хорошо понимаю конкретный вопрос c. Однако я верю, что вы действительно, действительно уверены , это хорошая идея - на первый взгляд, я бы очень беспокоился о том, чтобы сделать что-то похожее на арифметию c через approx()
функция от базовых целых чисел факторной переменной (которые совершенно бессмысленны). Мне кажется, что, вероятно, существует «лучший» (то есть менее хитрый) способ сделать это, но я не в состоянии помочь вам в этом, поскольку ваши общие цели мне не ясны.
Тем не менее, вот одна из возможных дорожных карт, чтобы делать то, что вы хотите, используя base
R:
- определить, какие переменные должны быть факторами
- внутри
approxData
, преобразовать их переменные обратно в факторный тип - переназначить
levels
новых факторных переменных на основе соответствующих значений из df
Код, расширенный дополнительным столбцом фактора (для проверки что он работает правильно в случае с более чем одной факторной переменной):
time = 1:6
df <- data.frame(ecuTime = c(2, 4, 6), a = as.factor(c("male", "female",
"male")), b = c(1, 3, 5),
c = c("blue", "blue", "yellow"))
str(df)
approxData <- cbind.data.frame(time, sapply(df[, names(df)],
function(y, x, nout)
approx(x, y, nout, method = "constant")$y,
x = df$ecuTime, nout = time))
str(approxData)
factor_vars <- names(df[, sapply(df, is.factor)])
approxData[, factor_vars] <-
lapply(factor_vars, function(x) {
approxData[[x]] <- factor(approxData[[x]]);
levels(approxData[[x]]) <- levels(df[[x]]);
approxData[[x]]
})
str(approxData)
Для отредактированного вопроса: вот некоторый код для создания нового фрейма данных, dfComb_resample
. Этот фрейм данных имеет расширенную переменную ecuTime
, значения для a, b, c, d
скопированы из df1
и df2
, где это необходимо, и NA
значений везде. (Если я пропустил отметку о том, что вы хотели, дайте мне знать.)
time = seq(1, 6, by = 0.1)
df1 <- data.frame(ecuTime = c(2, 4, 6), a = as.factor(c("male", "female",
"male")), b = c(1, 3, 5))
df2 <- data.frame(ecuTime = c(1, 3.2, 3.4, 6), c = as.factor(c("car", "car",
"bike", "car")), d = c(2, 3, 5, 6))
dfComb_resample <-
Reduce(function(x, y) merge(x=x, y=y, by = "ecuTime", all = TRUE),
list(data.frame(ecuTime = time), df1, df2))
Как это работает: Reduce()
- это ярлык для объединения трех (или более) фреймов данных одновременно в этом контексте . Обратите внимание, что вы бы столкнулись с неожиданным поведением, если бы какой-либо из объединенных фреймов данных имел общие переменные, чего нет в этом примере.