【问题标题】:simple data.frame reshape简单的data.frame重塑
【发布时间】:2012-05-15 07:50:32
【问题描述】:

我刚刚从长期中断的写作中回到 R,我在记住如何重塑数据时遇到了一些真正的问题。 我知道我想做的事情很容易,但出于某种原因,我今晚变得很笨,把自己和融化和重塑搞混了。 如果有人能迅速指出我正确的方向,将不胜感激。

我有一个这样的数据框:

person    week    year   
personA   6       1
personA   22      1
personA   41      1
personA   42      1
personA   1       2
personA   23      2
personB   8       2
personB   9       2
....
personN   x       y

我想按年份和按人对事件进行计数: (这样我就可以为每个人绘制多年来的快速折线图)

例如

person    year1    year2
personA   4        2
personB   0        2

非常感谢您的阅读。

【问题讨论】:

    标签: r dataframe reshape


    【解决方案1】:

    来自 base R 的xtabs 非常适合这个问题:

    dat <- read.table(text="person    week    year   
    personA   6       1
    personA   22      1
    personA   41      1
    personA   42      1
    personA   1       2
    personA   23      2
    personB   8       2
    personB   9       2
    ", header=TRUE)
    xtabs(~person+year, data=dat)
    #-----------------
             year
    person    1 2
      personA 4 2
      personB 0 2
    

    您可以将其输出传递给 matplot,因为它返回一个表/矩阵对象:

    matplot( xtabs(~person+year, data=dat))
    

    这个小例子上的输出 x 轴可能不是您想要的,但随着时间的推移,可能会有更令人满意的默认轴标签。或者您可以使用 xaxt="n" 隐藏默认的 x 轴标签,并使用 axis 随意标记:

    matplot(  xtabs(~person+year, data=dat), xaxt="n", type="b")
    

    【讨论】:

      【解决方案2】:

      在这种情况下,您可以简单地使用tapply

      > with(data, tapply(week, list(person=person, year=year), length))
               year
      person     1 2
        personA  4 2
        personB NA 2
      

      结果是一个矩阵。如果有空单元格,此解决方案会产生 NA。

      【讨论】:

      • 我一直想知道是否可以将一周内的NAs 合并到这个解决方案中......一种方法是将一周内的NAs 更改为一些奇怪的值,但我想知道是否有现成的解决方案...有什么想法吗?
      【解决方案3】:

      我可能会使用reshape2 包和dcast 函数,因为它可以一步处理整形和聚合:

      library(reshape2)
      > dcast(person ~ year, value.var = "year", data = dat)
      Aggregation function missing: defaulting to length
         person 1 2
      1 personA 4 2
      2 personB 0 2
      

      【讨论】:

      • 这很棒 - 之前使用过 reshape 但没有使用 reshape2 - 非常感谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      • 2021-10-26
      • 1970-01-01
      • 2021-10-02
      相关资源
      最近更新 更多