按组划分的观察数量

发布于 2024-12-17 07:49:35 字数 434 浏览 0 评论 0原文

在 RI 中,有一个数据框,其中的观察结果由多个值描述,其中一个值是一个因子。我已经按这个因素对数据集进行了排序,并且想添加一列,在其中我可以在该因素的每个级别上获得一些观察结果,例如

factor   obsnum
a        1
a        2
a        3
b        1
b        2
b        3
b        4
c        1
c        2
...

在 SAS 中,我可以这样做:

data logs.full;
    set logs.full;
    count + 1;
    by cookie;
    if first.cookie then count = 1;
run;

如何在 R 中实现这一点?

谢谢,

In R I have a data frame with observations described by several values one of which is a factor. I have sorted the dataset by this factor and would like to add a column in which I would get a number of observation on each level of the factor e.g.

factor   obsnum
a        1
a        2
a        3
b        1
b        2
b        3
b        4
c        1
c        2
...

In SAS I do it with something like:

data logs.full;
    set logs.full;
    count + 1;
    by cookie;
    if first.cookie then count = 1;
run;

How can I achieve that in R?

Thanks,

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

你是年少的欢喜 2024-12-24 07:49:35

使用rle(行程编码)和sequence

x <- c("a", "a", "a", "b", "b", "b", "b", "c", "c")

data.frame(
    x=x,
    obsnum = sequence(rle(x)$lengths) 
)

  x obsnum
1 a      1
2 a      2
3 a      3
4 b      1
5 b      2
6 b      3
7 b      4
8 c      1
9 c      2

Use rle (run length encoding) and sequence:

x <- c("a", "a", "a", "b", "b", "b", "b", "c", "c")

data.frame(
    x=x,
    obsnum = sequence(rle(x)$lengths) 
)

  x obsnum
1 a      1
2 a      2
3 a      3
4 b      1
5 b      2
6 b      3
7 b      4
8 c      1
9 c      2
放手` 2024-12-24 07:49:35

这是 ddply() 解决方案

dataset <- data.frame(x = c("a", "a", "a", "b", "b", "b", "b", "c", "c"))
library(plyr)
ddply(dataset, .(x), function(z){
  data.frame(obsnum = seq_along(z$x))
})

Here is the ddply() solution

dataset <- data.frame(x = c("a", "a", "a", "b", "b", "b", "b", "c", "c"))
library(plyr)
ddply(dataset, .(x), function(z){
  data.frame(obsnum = seq_along(z$x))
})
浮生面具三千个 2024-12-24 07:49:35

一种使用基础 R 的解决方案,假设您的数据位于名为 dfrdata.frame 中:

dfr$cnt<-do.call(c, lapply(unique(dfr$factor), function(curf){
  seq(sum(dfr$factor==curf))
}))

可能有更好的解决方案(例如,使用包 plyr 和它的 ddply ),但它应该可以工作。

One solution using base R, assuming your data is in a data.frame named dfr:

dfr$cnt<-do.call(c, lapply(unique(dfr$factor), function(curf){
  seq(sum(dfr$factor==curf))
}))

There are likely better solutions (e.g. employing package plyr and its ddply), but it should work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文