7

我刚刚从长时间的中断写作中回到 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

非常感谢您的阅读。

4

3 回答 3

8

我可能会使用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
于 2012-05-06T14:56:37.233 回答
7

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

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

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

于 2012-05-06T15:09:52.710 回答
5

xtabs从基础 R 非常适合这个问题:

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")
于 2012-05-06T15:44:40.980 回答