4 回答

TA貢獻1789條經驗 獲得超8個贊
德克的答案很棒。它還強調了用于索引data.frame
s和data.table
s 的語法的主要區別:
## The data.frame waydd[with(dd, order(-z, b)), ]## The data.table way: (7 fewer characters, but that's not the important bit)dd[order(-z, b)]
這兩個電話之間的差異很小,但它可能會產生重要影響。特別是如果您編寫生產代碼和/或關注研究中的正確性,最好避免不必要的重復變量名稱。data.table
幫助你做到這一點。
這是一個如何重復變量名稱可能會讓您陷入麻煩的示例:
讓我們從Dirk的答案中改變背景,并說這是一個更大的項目的一部分,其中有很多對象名稱,它們很長很有意義; 而不是dd
它被稱為quarterlyreport
。它成為了 :
quarterlyreport[with(quarterlyreport,order(-z,b)),]
好的。沒有錯。接下來,您的老板要求您在報告中包含上一季度的報告。你仔細檢查代碼,lastquarterlyreport
在各個地方添加一個對象,以某種方式(地球上怎么樣?)你最終會得到這個:
quarterlyreport[with(lastquarterlyreport,order(-z,b)),]
這不是你的意思,但你沒有發現它,因為你做得很快,而且它坐落在一個類似代碼的頁面上。代碼不會失?。]有警告也沒有錯誤),因為R認為這就是你的意思。你希望看到你的報告的人發現它,但也許他們沒有。如果您經常使用編程語言,那么這種情況可能都是熟悉的。你會說這是一個“錯字”。我會解決你對老板說的“拼寫錯誤”。
在data.table
我們關注這樣微小的細節。所以我們做了一些簡單的事情,以避免兩次輸入變量名。非常簡單。i
在dd
自動框架內進行評估。你根本不需要with()
。
代替
dd[with(dd, order(-z, b)), ]
只是
dd[order(-z, b)]
而不是
quarterlyreport[with(lastquarterlyreport,order(-z,b)),]
只是
quarterlyreport[order(-z,b)]
這是一個非常小的差異,但它可能只是有一天挽救你的脖子。權衡此問題的不同答案時,請考慮將變量名稱的重復計算為您決定的標準之一。有些答案有不少重復,有些則沒有。

TA貢獻1780條經驗 獲得超4個贊
這里有很多優秀的答案,但是dplyr提供了我能夠快速且容易記住的唯一語法(現在經常使用):
library(dplyr)
# sort mtcars by mpg, ascending... use desc(mpg) for descending
arrange(mtcars, mpg)
# sort mtcars first by mpg, then by cyl, then by wt)
arrange(mtcars , mpg, cyl, wt)
對于OP的問題:
arrange(dd, desc(z), b)
b x y z
1 Low C 9 2
2 Med D 3 1
3 Hi A 8 1
4 Hi A 9 1
- 4 回答
- 0 關注
- 1815 瀏覽
添加回答
舉報