4

我有一个数据框,其中包含 70-80 行有序响应时间 (rt) 数据,每个 228 人都有一个唯一的 id#(每个人的行数都不相同)。我想将每个人的 RT 分成 5 个箱子。我希望第一个箱是他们最快的 20% 的 RT,第二个箱是他们下一个最快的 20% 的 RT,等等。每个箱应该有相同数量的试验(除非试验的总数是奇数)。

我当前的数据框如下所示:

id     RT
7000   225
7000   250
7000   253
7001   189
7001   201
7001   225

我希望我的新数据框看起来像这样:

id   RT    Bin
7000  225    1
7000  250    1

让我的数据看起来像这样后,我将按 id 和 bin 聚合

我能想到的唯一方法是将数据拆分为一个列表(使用 split 命令),遍历每个人,使用 quantile 命令获取不同 bin 的断点,分配 bin 值(1- 5) 到每个响应时间。这感觉非常复杂(对我来说很难)。我有点卡住了,我将非常感谢有关如何简化此过程的任何帮助。谢谢。

4

3 回答 3

4

@Chase 给出的答案将范围分成 5 组等长(端点的差异)。您似乎想要的是 pentiles(5 组,每组数量相同)。为此,您需要以下cut2功能Hmisc

library("plyr")
library("Hmisc")

dat <- data.frame(id = rep(1:10, each = 10), value = rnorm(100))

tmp <- ddply(dat, "id", transform, hists = as.numeric(cut2(value, g = 5)))

tmp 现在有你想要的

> tmp
    id       value hists
1    1  0.19016791     3
2    1  0.27795226     4
3    1  0.74350982     5
4    1  0.43459571     4
5    1 -2.72263322     1
....
95  10 -0.10111905     3
96  10 -0.28251991     2
97  10 -0.19308950     2
98  10  0.32827137     4
99  10 -0.01993215     4
100 10 -1.04100991     1

hists每个都有相同的数字id

> table(tmp$id, tmp$hists)

     1 2 3 4 5
  1  2 2 2 2 2
  2  2 2 2 2 2
  3  2 2 2 2 2
  4  2 2 2 2 2
  5  2 2 2 2 2
  6  2 2 2 2 2
  7  2 2 2 2 2
  8  2 2 2 2 2
  9  2 2 2 2 2
  10 2 2 2 2 2
于 2011-10-06T15:43:08.383 回答
3

plyr这是一个使用包和cut函数的可重现示例:

dat <- data.frame(id = rep(1:10, each = 10), value = rnorm(100))

ddply(dat, "id", transform, hists = cut(value, breaks = 5))

    id       value             hists
1    1 -1.82080027     (-1.94,-1.41]
2    1  0.11035796     (-0.36,0.166]
3    1 -0.57487134    (-0.886,-0.36]
4    1 -0.99455189    (-1.41,-0.886]
....
96  10 -0.03376074    (-0.233,0.386]
97  10 -0.71879488   (-0.853,-0.233]
98  10 -0.17533570    (-0.233,0.386]
99  10 -1.07668282    (-1.47,-0.853]
100 10 -1.45170078    (-1.47,-0.853]

如果您想要返回简单的整数值而不是 bin,请传递labels = FALSE给。cut

于 2011-10-06T02:40:49.803 回答
0

这是简单的旧 R 中的答案。

#make up some data
df <- data.frame(rt = rnorm(60), id = rep(letters[1:3], rep(20)) )

#and this is all there is to it
df <- df[order(df$id, df$rt),]
df$bin <- rep( unlist( tapply( df$rt, df$id, quantile )), each = 4)

您会注意到使用的quantile命令可以设置为使用任何分位数。默认值适用于五分位数,但如果您想要十分位数,请使用

quantile(x, seq(0, 1, 0.1))

在上面的函数中。

上面的答案有点脆弱。它需要相同数量的 RTs/id,我没有告诉你如何达到神奇的数字 4。但是,它在大型数据集上运行也非常快。如果您想在基础 R 中获得更强大的解决方案。

library('Hmisc')
df <- df[order(df$id),]
df$bin <- unlist(lapply( unique(df$id), function(x) cut2(df$rt[df$id==x], g = 5) ))

这比第一个解决方案强大得多,但速度没有那么快。对于小型数据集,您不会注意到。

于 2011-10-06T04:10:54.673 回答