首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用时间融化

用时间融化
EN

Stack Overflow用户
提问于 2013-03-26 23:53:51
回答 2查看 400关注 0票数 3

我正在尝试用chron类来融化一个数据框

代码语言:javascript
运行
复制
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()

代码语言:javascript
运行
复制
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

但它还能更简单吗?(我想保留chron类)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-27 00:33:17

(1)我假设您在运行所示代码之前发出了此命令:

代码语言:javascript
运行
复制
library(reshape2)

在这种情况下,您可以使用重塑包来代替。它不会导致这个问题:

代码语言:javascript
运行
复制
library(reshape)

其他解决方案是

(2)使用R的reshape函数:

代码语言:javascript
运行
复制
reshape(direction = "long", data = x, varying = list(2:3), v.names = "Var")

(3)或将计时列转换为数字,使用reshape2包中的melt,然后转换回来:

代码语言:javascript
运行
复制
library(reshape2)
xt <- transform(x, Index = as.numeric(Index))
transform(melt(xt, id = 1), Index = chron(Index))

添加了其他解决方案。

票数 2
EN

Stack Overflow用户

发布于 2013-03-27 00:18:22

我不确定,但我认为这可能是chron (也可能是data.frame,但这似乎不太可能)中的一个“疏忽”。

reshape2中的melt.data.frame中构造数据框时会出现此问题,该数据框通常使用回收,但data.frame的该部分

代码语言:javascript
运行
复制
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。这将删除错误,但会更改日期和时间:

代码语言:javascript
运行
复制
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日期时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15641538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档