• R语言
  • 询问:子数据筛选的矩阵运算

对于类似的数据df.A,不知根据条件刷选出子数据可有好的方法。

如下是用for循环做的,但如果数据量巨大的话,很费时间,不知有什么好的矩阵方式可以做。

<br />
> (df.A <- data.frame(A=rep(c('a','b','c'),3),B=rep('q',9),Value=sample(9),C=tail(letters,9)))<br />
  A B Value C<br />
1 a q     7 r<br />
2 b q     3 s<br />
3 c q     8 t<br />
4 a q     5 u<br />
5 b q     6 v<br />
6 c q     4 w<br />
7 a q     2 x<br />
8 b q     9 y<br />
9 c q     1 z<br />
> df.B <- aggregate(list(Count=df.A[,'Value']),df.A[,c('A','B')],length)<br />
## df.B 做筛选用,根据factor A,B得出如下子数据<br />
> df.C<-list()<br />
> for(i in 1:nrow(df.B)){df.C[[i]]<-(df.A[df.A[,1]==df.B[i,1]&df.A[,2]==df.B[i,2],])}<br />
> df.C<br />
[[1]]<br />
  A B Value C<br />
1 a q     8 r<br />
4 a q     2 u<br />
7 a q     6 x</p>
<p>[[2]]<br />
  A B Value C<br />
2 b q     9 s<br />
5 b q     7 v<br />
8 b q     3 y</p>
<p>[[3]]<br />
  A B Value C<br />
3 c q     4 t<br />
6 c q     5 w<br />
9 c q     1 z<br />
</p>

或做如下的计算,得出df.A$Value最大值时因子C值的数据筛选,以下都是for循环,数据量大的情况下太慢了~ 不知可有好的建议[s:15]

<br />
> df.B <- aggregate(list(Max=df.A[,'Value']),df.A[,c('A','B')],max)<br />
> for(i in 1:nrow(df.B)){df.B$C[i]<-as.character(df.A[df.A[,1]==df.B[i,1]&df.A[,2]==df.B[i,2]&df.A[,3]==df.B[i,3],'C'])}<br />
> df.B<br />
  A B Max C<br />
1 a q   8 r<br />
2 b q   9 s<br />
3 c q   5 w</p>
<p>
</p>

回复 第1楼 的 petboy:

<br />
library(plyr)<br />
 dlply(df.A, .(A,B), function(x) x)<br />
$a.q<br />
  A B Value C<br />
1 a q     7 r<br />
4 a q     2 u<br />
7 a q     1 x</p>
<p>$b.q<br />
  A B Value C<br />
2 b q     8 s<br />
5 b q     4 v<br />
8 b q     5 y</p>
<p>$c.q<br />
  A B Value C<br />
3 c q     6 t<br />
6 c q     3 w<br />
9 c q     9 z</p>
<p>
</p>

回复 第2楼 的 petboy:

<br />
ddply(df.A, .(A,B), function(x) x[which.max(x$Value),])<br />
  A B Value C<br />
1 a q     7 r<br />
2 b q     8 s<br />
3 c q     9 z</p>
<p>
</p>

非常感谢 平时都用基础包这些扩展包没接触到~ 看来要花时间好好看看了 呵呵

发现R的数据类型太多了

最近为这个function找了些函数试验,发现有'by类型','ftable类型','"xtabs" "table"类型',好多好杂,发现数据提取面没那么熟悉,呵呵。

library(plyr)

为什么我的R说:

> library(plyr)

错误于library(plyr) : 不存在叫'plyr'这个名字的程辑包

回复 第4楼 的 petboy:

不用扩展包也行:只是代码稍微绕一点。。

<br />
> df.A <- data.frame(A=rep(c('a','b','c'),3),B=rep('q',9),Value=sample(9),C=tail(letters,9))<br />
> tapply(1:nrow(df.A), paste(df.A$A, df.A$B, sep=""), function(x) df.A[x,])<br />
$aq<br />
  A B Value C<br />
1 a q     1 r<br />
4 a q     6 u<br />
7 a q     8 x</p>
<p>$bq<br />
  A B Value C<br />
2 b q     2 s<br />
5 b q     3 v<br />
8 b q     9 y</p>
<p>$cq<br />
  A B Value C<br />
3 c q     5 t<br />
6 c q     7 w<br />
9 c q     4 z</p>
<p>> tapply(1:nrow(df.A), paste(df.A$A, df.A$B, sep="_"), function(x) max(df.A[x,]$Value))<br />
a_q b_q c_q<br />
  8   9   7<br />
><br />
</p>

呵呵 又学了一招~

不过,扩展包提供了一个很大的优势就是可以对subdata作任何想做的事情,然后return返回。这个便利性还是非常好的。