R:修剪数据帧

时间:2012-08-21 05:00:32

标签: r

不确定如何标题,所以请更改它:)

如果我有这样的数据并且我想修剪它,使得如果V5中的任何值都有多个,那么只保留具有V4最高值的行。因此,例如,对于V5 = 7200,行id 25和行ID 20,但我只想保留行ID 20,因为它的V4更高。

      V4   V5
29  9.94 5900
28 10.56 5100
27 11.34 6200
26 11.42 8300
25 13.16 7200
24 13.78 7500
23 14.16 6200
22 14.26 7500
21  14.6 7400
20 14.64 7200
19 15.86 8800

为:

      V4   V5
29  9.94 5900
28 10.56 5100
26 11.42 8300
23 14.16 6200
22 14.26 7500
21  14.6 7400
20 14.64 7200
19 15.86 8800

有没有办法以矢量化方式或可能是一些聪明的捷径?如果我必须为很多不同的矩阵做这件事,可能需要一段时间才能使用简单的结构(对于循环等)。

2 个答案:

答案 0 :(得分:2)

df<-read.table(header=T,text="      V4   V5
29  9.94 5900
28 10.56 5100
27 11.34 6200
26 11.42 8300
25 13.16 7200
24 13.78 7500
23 14.16 6200
22 14.26 7500
21  14.6 7400
20 14.64 7200
19 15.86 8800")


df1<-df[with(df,order(V4,decreasing=T)),]
df1<-df1[!duplicated(df1$V5),]
> df1
      V4   V5
19 15.86 8800
20 14.64 7200
21 14.60 7400
22 14.26 7500
23 14.16 6200
26 11.42 8300
28 10.56 5100
29  9.94 5900

df1<-df1[with(df1,order(V4)),] # if your order is important

> df1
      V4   V5
29  9.94 5900
28 10.56 5100
26 11.42 8300
23 14.16 6200
22 14.26 7500
21 14.60 7400
20 14.64 7200
19 15.86 8800

答案 1 :(得分:1)

df <- data.frame(V4=c(9,10,11,12,13,14,15,16),V5=c(1,2,3,3,4,5,6,6))

df
  V4 V5
1  9  1
2 10  2
3 11  3
4 12  3
5 13  4
6 14  5
7 15  6
8 16  6

df2 <- aggregate(list(V4=df$V4),by=list(V5=df$V5),function(x){max(x)})

df2
  V5 V4
1  1  9
2  2 10
3  3 12
4  4 13
5  5 14
6  6 16