сохранить столбцы типового фактора, используя приблизительно в кадре данных в R - PullRequest
0 голосов
/ 05 мая 2020

У меня большой фрейм данных с множеством столбцов. Некоторые из них относятся к типу двойных, а другие - к типу фактора. Я передискретизирую фрейм данных, добавив новый столбец «время» с функцией приближения и методом = «константа». После этого все факторные столбцы заменяются на двойные.

Например:

So my idea looks like this:

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 <- merge(df1, df2, by = "ecuTime", all = TRUE)

approxData <- cbind.data.frame(time, sapply(dfComb[, names(dfComb)], 
                                        function(y, x, nout) 
                                        approx(x, y, nout, method = "constant", na.rm = FALSE)$y,
                                        x = dfComb$ecuTime, nout = time))

Можно ли сохранить столбцы факторов как факторы, а столбцы типа удваиваются как удвоения, даже если я использую функцию прибл?

Изменить: я обнаружил, что нет смысла использовать функцию приближения для факторов и не хочу использовать na.rm = TRUE, потому что у меня много NA в некоторых столбцах, и если я заменю их предыдущими значениями там будет действительно большим отличием от исходных данных относительно распределений et c. Есть ли альтернативное решение, чтобы просто выполнить функцию приближения для столбцов без факторов, а затем объединить ее с исходными столбцами факторов? Я думаю, что имеет смысл не заполнять столбцы факторов предыдущими значениями и использовать только исходные значения, связанные с временем повторной выборки, например 0,1, 0,2 и т. Д. c. После этого его можно было объединить.

Я просто не понимаю, как объединить df1 и df2 с повторной дискретизацией временной частоты, чтобы мои распределения и линейные графики полностью отличались от исходных данных. Моя конечная цель, которую я хочу достичь, - это провести некоторое сравнение некоторых определенных c факторов в определенные c временные рамки. Поэтому я не могу сравнивать разные переменные, потому что другая может быть NA.

1 Ответ

1 голос
/ 06 мая 2020

Итак, я не совсем понимаю, что вы пытаетесь здесь сделать, и это нормально; Я достаточно хорошо понимаю конкретный вопрос 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() - это ярлык для объединения трех (или более) фреймов данных одновременно в этом контексте . Обратите внимание, что вы бы столкнулись с неожиданным поведением, если бы какой-либо из объединенных фреймов данных имел общие переменные, чего нет в этом примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...