8

次のコードを使用して、Compound、Replicate、Massでグループ化されたデータを要約します。

summaryDataFrame <- ddply(reviewDataFrame, .(Compound, Replicate, Mass), 
  .fun = calculate_T60_Over_T0_Ratio)

不幸な副作用は、結果のデータフレームがそれらのフィールドでソートされることです。これを実行して、Compound、Replicate、Massを元のデータフレームと同じ順序に保ちたいと思います。何か案は?順次整数の「Sorting」列を元のデータに追加しようとしましたが、「group by」したくないので、もちろん.variablesに含めることはできません。そのため、この列は返されません。 summaryDataFrame。

助けてくれてありがとう。

4

2 に答える 2

11

これはplyrしばらく前にメーリング リストに登場しました (@kohske によって提起されました)。

#Peter's version used a function gensym to
# create the col name, but I couldn't track down
# what package it was in.
keeping.order <- function(data, fn, ...) { 
  col <- ".sortColumn"
  data[,col] <- 1:nrow(data) 
  out <- fn(data, ...) 
  if (!col %in% colnames(out)) stop("Ordering column not preserved by function") 
  out <- out[order(out[,col]),] 
  out[,col] <- NULL 
  out 
} 

#Some sample data 
d <- structure(list(g = c(2L, 2L, 1L, 1L, 2L, 2L), v = c(-1.90127112738315, 
-1.20862680183042, -1.13913266070505, 0.14899803094742, -0.69427656843677, 
0.872558638137971)), .Names = c("g", "v"), row.names = c(NA, 
-6L), class = "data.frame") 

#This one resorts
ddply(d, .(g), mutate, v=scale(v)) #does not preserve order of d 

#This one does not
keeping.order(d, ddply, .(g), mutate, v=scale(v)) #preserves order of d 

この機能がロールバックするのに十分なほど一般的ではない理由について、Hadley のメモのスレッドを読んでくださいddply

より一般的なケースの戦略を含めるように編集

ddplyが好きではない順序でソートされたものを出力している場合、基本的に 2 つのオプションがあります。順序付けられた係数を使用して、事前に分割変数で目的の順序を指定するか、事後に出力を手動でソートします。

たとえば、次のデータを考えてみましょう。

d <- data.frame(x1 = rep(letters[1:3],each = 5), 
                x2 = rep(letters[4:6],5),
                x3 = 1:15,stringsAsFactors = FALSE)

今のところ、文字列を使用しています。ddply出力をソートします。この場合、デフォルトの字句順序が必要になります。

> ddply(d,.(x1,x2),summarise, val = sum(x3))
  x1 x2 val
1  a  d   5
2  a  e   7
3  a  f   3
4  b  d  17
5  b  e   8
6  b  f  15
7  c  d  13
8  c  e  25
9  c  f  27


> ddply(d[sample(1:15,15),],.(x1,x2),summarise, val = sum(x3))
  x1 x2 val
1  a  d   5
2  a  e   7
3  a  f   3
4  b  d  17
5  b  e   8
6  b  f  15
7  c  d  13
8  c  e  25
9  c  f  27

結果のデータ フレームが「正しい」順序で終わらない場合は、おそらく、それらの変数の一部を順序付きの要素にしたいためです。私たちが本当に欲しくx1x2注文したとしましょう:

d$x1 <- factor(d$x1, levels = c('b','a','c'),ordered = TRUE)
d$x2 <- factor(d$x2, levels = c('d','f','e'), ordered = TRUE)

を使用するddplyと、結果の並べ替えは意図したとおりになります。

> ddply(d,.(x1,x2),summarise, val = sum(x3))
  x1 x2 val
1  b  d  17
2  b  f  15
3  b  e   8
4  a  d   5
5  a  f   3
6  a  e   7
7  c  d  13
8  c  f  27
9  c  e  25

ここでの話の教訓は、 がddply意図しない順序で何かを出力している場合、それは、分割している変数に順序付けられた因子を使用する必要があるという良い兆候であるということです。

于 2011-08-29T20:30:23.057 に答える
1

最終的に、元のデータフレームに「インデックス作成」列を追加することになりました。pastedが付いた2つの列で構成されていましたsep="_"unique次に、「indexing」列のメンバーとカウンターのみで構成される別のデータフレームを作成しました1:length(df)。ソートされたddply()データフレームを返すデータに対して実行しました。次に、元の順序に戻すためにmerge()、結果データフレームとインデックスデータフレームを作成しました(列の名前が同じであることを確認すると、これが簡単になります)。最後にorder、余分な列を削除しました。

エレガントなソリューションではありませんが、機能するソリューションです。

助けてくれてありがとう。それは私に正しい方向に考えさせました。

于 2011-08-30T15:57:54.490 に答える