Таять с хрон
Я пытаюсь растопить фрейм данных с помощью класса chron
library(chron)
x = data.frame(Index = as.chron(c(15657.00,15657.17)), Var1 = c(1,2), Var2 = c(9,8))
x
Index Var1 Var2
1 (11/13/12 00:00:00) 1 9
2 (11/13/12 04:04:48) 2 8
y = melt(x,id.vars="Index")
Error in data.frame(ids, variable, value, stringsAsFactors = FALSE) :
arguments imply differing number of rows: 2, 4
Я могу обмануть as.numeric()
следующее:
x$Index= as.numeric(x$Index)
y = melt(x,id.vars="Index")
y$Index = as.chron(y$Index)
y
Index variable value
1 (11/13/12 00:00:00) Var1 1
2 (11/13/12 04:04:48) Var1 2
3 (11/13/12 00:00:00) Var2 9
4 (11/13/12 04:04:48) Var2 8
Но может ли это быть проще? (Я хочу сохранить класс хрон)
2 ответа
(1) Я предполагаю, что вы выполнили эту команду перед запуском показанного кода:
library(reshape2)
В этом случае вы могли бы вместо этого использовать пакет reshape. Это не приводит к этой проблеме:
library(reshape)
Другие решения должны
(2) использовать R reshape
функция:
reshape(direction = "long", data = x, varying = list(2:3), v.names = "Var")
(3) или преобразовать столбец хрон в числовой, используйте melt
из пакета reshape2 и затем преобразовать обратно:
library(reshape2)
xt <- transform(x, Index = as.numeric(Index))
transform(melt(xt, id = 1), Index = chron(Index))
ДОБАВЛЕНЫ дополнительные решения.
Я не уверен, но я думаю, что это может быть "недосмотр" в хрон (или, возможно, data.frame
, но это кажется маловероятным).
Проблема возникает при построении фрейма данных в melt.data.frame
в Reshape2, который обычно использует переработку, но эта часть data.frame
:
for (j in seq_along(xi)) {
xi1 <- xi[[j]]
if (is.vector(xi1) || is.factor(xi1))
xi[[j]] <- rep(xi1, length.out = nr)
else if (is.character(xi1) && class(xi1) == "AsIs")
xi[[j]] <- structure(rep(xi1, length.out = nr), class = class(xi1))
else if (inherits(xi1, "Date") || inherits(xi1, "POSIXct"))
xi[[j]] <- rep(xi1, length.out = nr)
else {
fixed <- FALSE
break
}
похоже, идет не так, как переменная chron не наследует ни Date, ни POSIXct. Это удаляет ошибку, но изменяет время:
x = data.frame(Index = as.chron(c(15657.00,15657.17)), Var1 = c(1,2), Var2 = c(9,8))
class(x$Index) <- c(class(x$Index),'POSIXct')
y = melt(x,id.vars="Index")
Как я уже сказал, эта сорта пахнет где-то жуком. Мои деньги были бы на необходимости, чтобы chron добавил POSIXct к вектору классов, но я могу ошибаться. Очевидная альтернатива - вместо этого использовать дату POSIXct.