R:将列中的变量按日期转换为行

时间:2015-11-18 18:43:28

标签: r

[解决方案]我找到了解决问题的方法。

  require(data.table)
  dt <- data.table(dataframe)
  newdt<-dt[, number := 1:.N, by = Date] 
  data<-as.data.frame(newdt)

data_wide <- reshape(newdt, direction="wide", idvar = "Date", timevar =   "number")

data_wide

6/26/2015   209.3     230.2     80.4     s2
6/27/2015   209.1     227.2     239.2    s2

编辑2:我认为如果我能弄清楚如何在原始数据框中创建一个标签行数(或者有效值)中的新列,其他人提供的解决方案就可以了变量1)每个日期。换句话说,我想在每次更改日期时重新​​开始标记行。例如,

6/26/2015   1   209.3
6/26/2015   2   230.2
6/26/2015   3   80.4
6/26/2015   4   s2
6/27/2015   1 ....

然后我可以使用其他帖子中描述的重塑方法。

编辑:这接近How to reshape data from long to wide format?,但是为了使这些答案适合我的数据,我需要一个新的列,每天为变量分配一个1长度的变量1,我没有。

换句话说,如果我使用

data_wide <- reshape(data,direction="wide", idvar = "Date", timevar = "Variable 1")
data_wide

然后,因为变量1有200多个唯一条目,data_wide每个日期有200多列,其中大多数是na,因为变量1的值通常只存在于数据中的单个日期,而数据是一个超过5000个日期的时间序列。 ~~~~~~~~~~~~

我有一个数据框,第1列= Date,第2列= Variable 1,其中变量1通常是数字。 E.g。

6/26/2015   209.3    
6/26/2015   230.2    
6/26/2015   80.4     
6/26/2015   s2       
6/27/2015   209.1    
6/27/2015   227.2    
6/27/2015   239.2    
6/27/2015   s2       

我希望能够使用新值标记行,该值只是该日期的行号。

6/26/2015   209.3    1
6/26/2015   230.2    2
6/26/2015   80.4     3
6/26/2015   s2       4
6/27/2015   209.1    1
6/27/2015   227.2    2
6/27/2015   239.2    3
6/27/2015   s2       4

[原帖]

我有一个数据框,第1列= Date,第2列= Variable 1,其中变量1通常是数字。 E.g。

6/26/2015   209.3
6/26/2015   230.2
6/26/2015   80.4
6/26/2015   s2
6/27/2015   209.1
6/27/2015   227.2
6/27/2015   239.2
6/27/2015   s2
6/28/2015   230.2
6/28/2015   228.2
6/28/2015   36.4
6/28/2015   s2
6/29/2015   209.3
6/29/2015   15.3
6/29/2015   15.4
6/29/2015   s2

我希望能够&#34;转置&#34;数据使每个日期都有自己的行,同一日期的每个变量都在同一行。 E.g。

6/26/2015   209.3     230.2     80.4     s2
6/27/2015   209.1     227.2     239.2    s2

等等。虽然此示例显示每个日期变量1的条目数相同,但情况并非总是如此。我希望能够允许将任意数量的变量折叠到日期。

一个复杂的因素是实际上还有两列,变量2和变量3,它们在一个日期内是常量,但可能在两个日期之间变化。我希望那些也可以折叠到日期,但我只需要在新数据框中为每个变量添加一列。

我尝试过使用dcast和reshape函数,但这些函数没有给出预期的结果。有没有人有建议?

2 个答案:

答案 0 :(得分:1)

这最好通过tapply处理:类似

tapply(data$`Variable 1`, data$date, c)

创建一个参差不齐的数组。不规则数组的类型与您对预期结果的描述相匹配。请注意,原始订单可能会丢失,但您可以通过(例如)按日期排序来恢复合理的订单。

您不能(明智地)将结果转换为合法数据框,因为您的数据类型意味着每行可变数量的列。数据框不适用于此用途,如果以这种方式处理,您将立即遇到更多问题。

或者,原始稀疏矩阵有多少NA有什么问题?这是您正在讨论的数据类型的另一个有效表示。

如果您只对有效值的计数感兴趣,请执行以下操作:

aggregate(data=data,`Variable 1`~Date,length)

对于mtcars数据集,会发生这种情况:

aggregate(data=mtcars,wt~cyl,length)
  cyl wt
1   4 11
2   6  7
3   8 14

请注意,wt只是一个值的计数,它不关心wt的类型或值,只关心它的数量(长度)。

答案 1 :(得分:0)

此解决方案采用数据框,其中第1列包含为多行重复的日期值,第2列包含每行的值。目标是建立一个新的数据框,其中第1列不包含重复日期,每行(日期)包含第2列中列出的所有值,主要是缩短日期并将第2列转换为日期。要使用重塑进行此操作,首先,同一日期的每个值都需要一个数字。

   require(data.table)
      dt <- data.table(dataframe)
      newdt<-dt[, number := 1:.N, by = Date] 
      data<-as.data.frame(newdt)

    data_wide <- reshape(newdt, direction="wide", idvar = "Date", timevar =   "number")

    data_wide

    6/26/2015   209.3     230.2     80.4     s2
    6/27/2015   209.1     227.2     239.2    s2