简单的data.frame重塑

use*_*122 7 r reshape dataframe

我刚刚从一个漫长的间隙写作回到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
Run Code Online (Sandbox Code Playgroud)

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

例如

person    year1    year2
personA   4        2
personB   0        2
Run Code Online (Sandbox Code Playgroud)

非常感谢阅读.

Cha*_*ase 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
Run Code Online (Sandbox Code Playgroud)


Ern*_*t A 7

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

> with(data, tapply(week, list(person=person, year=year), length))
         year
person     1 2
  personA  4 2
  personB NA 2
Run Code Online (Sandbox Code Playgroud)

结果是一个矩阵.如果存在空单元,则该解决方案产生NA.


42-*_*42- 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
Run Code Online (Sandbox Code Playgroud)

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

matplot( xtabs(~person+year, data=dat))
Run Code Online (Sandbox Code Playgroud)

这个微小示例的输出x轴可能不是您想要的,但是使用更多年,可能会有更令人满意的默认轴标记.或者您可以使用xaxt ="n"来抑制默认的x轴标签,并根据需要使用axis标签:

matplot(  xtabs(~person+year, data=dat), xaxt="n", type="b")
Run Code Online (Sandbox Code Playgroud)