2012-08-30 13 views
0

我有一个包含3列的数据帧。 A,B,C。有多个行对应于列a的每个唯一值。我想选择对应于列a的每个唯一值的前5行。列c是一些值,并且数据框已经按降序排序,所以这不会成为问题。任何人都可以请建议我如何能在R.为R数据帧中列的每个唯一值选择最大有限行数

+2

'plyr :: ddply'和'head'或'data.table'的组合。 SO – mnel

+1

上有很多例子,如果在查找与您的问题类似的SO帖子之后,仍然找不到有用的答案,[可重现的示例](http://stackoverflow.com/questions/) 5963269/how-to-make-a-great-r-reproducible-example)将有很大帮助 – BenBarnes

回答

4

偷@ ptocquin的例子,这里是你如何使用基础功能by。您可以使用do.call将结果展平(请参阅下文)。

> by(data = data, INDICES = data$a, FUN = function(x) head(x, 5)) 
# or by(data = data, INDICES = data$a, FUN = head, 5) 
data$a: 1 
    a   b   c 
21 1 0.1188552 1.6389895 
41 1 1.0182033 1.4811359 
61 1 -0.8795879 0.7784072 
81 1 0.6485745 0.7734652 
31 1 1.5102255 0.7107957 
------------------------------------------------------------ 
data$a: 2 
    a   b   c 
15 2 -1.09704040 1.1710693 
85 2 0.42914795 0.8826820 
65 2 -1.01480957 0.6736782 
45 2 -0.07982711 0.3693384 
35 2 -0.67643885 -0.2170767 
------------------------------------------------------------ 

类似的事情可以通过拆分基于a您data.frame,然后使用lapply来逐步每一个元素子集化第一n行来实现。

split.data <- split(data, data$a) 
subsetted.data <- lapply(split.data, FUN = function(x) head(x, 5)) # or ..., FUN = head, 5) like above 
flatten.data <- do.call("rbind", subsetted.data) 
head(flatten.data) 
     a   b   c 
1.21 1 0.11885516 1.63898947 
1.41 1 1.01820329 1.48113594 
1.61 1 -0.87958790 0.77840718 
1.81 1 0.64857445 0.77346517 
1.31 1 1.51022545 0.71079568 
2.15 2 -1.09704040 1.17106930 
2.85 2 0.42914795 0.88268205 
2.65 2 -1.01480957 0.67367823 
2.45 2 -0.07982711 0.36933837 
2.35 2 -0.67643885 -0.21707668 
1

这里做,这是我的尝试:

library(plyr) 
data <- data.frame(a=rep(sample(1:20,10),10),b=rnorm(100),c=rnorm(100)) 
data <- data[rev(order(data$c)),] 
head(data, 15) 

a   b  c 
28 6 1.69611039 1.720081 
91 11 1.62656460 1.651574 
70 9 -1.17808386 1.641954 
6 15 1.23420550 1.603140 
23 7 0.70854914 1.588352 
51 11 -1.41234359 1.540738 
19 10 2.83730734 1.522825 
49 10 0.39313579 1.370831 
80 9 -0.59445323 1.327825 
59 10 -0.55538404 1.214901 
18 6 0.08445888 1.152266 
86 15 0.53027267 1.066034 
69 10 -1.89077464 1.037447 
62 1 -0.43599566 1.026505 
3 7 0.78544009 1.014770 

result <- ddply(data, .(a), "head", 5) 
head(result, 15) 

    a   b   c 
1 1 -0.43599566 1.02650544 
2 1 -1.55113486 0.36380251 
3 1 0.68608364 0.30911430 
4 1 -0.85406406 0.05555500 
5 1 -1.83894595 -0.11850847 
6 5 -1.79715809 0.77760033 
7 5 0.82814909 0.22401278 
8 5 -1.52726859 0.06745849 
9 5 0.51655092 -0.02737905 
10 5 -0.44004646 -0.28106808 
11 6 1.69611039 1.72008079 
12 6 0.08445888 1.15226601 
13 6 -1.99465060 0.82214319 
14 6 0.43855489 0.76221979 
15 6 -2.15251353 0.64417757 
+0

请注意,@RomanLuštrik的解决方案比我的效率高得多:10倍更快! – ptocquin

相关问题