简单的data.frame重塑

时间:2012-05-06 14:36:08

标签: r dataframe reshape

我刚刚从一个漫长的间隙写作回到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

我希望按年份和按人数计算事件数量: (这样我可以为多年来为每个人绘制一个快速折线图)

e.g。

person    year1    year2
personA   4        2
personB   0        2

非常感谢您阅读。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:7)

在这种情况下,您只需使用tapply

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

结果是矩阵。如果存在空单元,则此解决方案会生成NA。

答案 2 :(得分:5)

来自基地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")