這來了個plyr
郵件列表而回(由@kohske不低於募集),這是由Peter Meilstrup有限的情況下,提供了一個解決方案:
#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
請務必閱讀thread爲哈德利的關於爲什麼這個功能可能不夠普遍以至於無法捲入ddply
的筆記,特別是它可能適用於您的情況,因爲您可能每個作品返回的行較少。
編輯,包括更普遍的情況下
如果ddply
正在輸出的東西,是你不喜歡的順序進行排序的策略,你基本上有兩種選擇:指定在分裂變量所需的訂貨提前使用排序的因素,或在事實後手動對輸出進行排序。使用字符串,現在
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
,有可能是因爲你真的想一些那些變量被排序的因素。假設我們真的很想x1
和x2
下令像這樣:
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
按照您不打算的順序輸出內容,這是一個好兆頭,您應該使用有序因子來分解您正在分解的變量。
這與'write.table'無關;標題應該改變。 –