2012-04-03 67 views
5

R的data.table包提供基於密鑰的值的快速子集。如何使用R的data.table包對鍵值進行否定?

因此,舉例來說:

set.seed(1342) 

df1 <- data.table(group = gl(10, 10, labels = letters[1:10]), 
        value = sample(1:100)) 
setkey(df1, group) 

df1["a"] 

將在DF1其中組== 「是」 返回所有行。

如果我想要df1其中group != "a"的所有行怎麼辦?是否有使用data.table的簡明語法?

回答

8

我想你回答了你自己的問題:

> nrow(df1[group != "a"]) 
[1] 90 
> table(df1[group != "a", group]) 

a b c d e f g h i j 
0 10 10 10 10 10 10 10 10 10 

看起來很簡潔給我嗎?

編輯馬修:根據評論這一矢量掃描。有一個不加入成語hereherefeature request #1384使其更容易。

編輯:feature request #1384在data.table 1.8.3

df1[!'a'] 

# and to avoid the character-to-factor coercion warning in this example (where 
# the key column happens to be a factor) : 
df1[!J(factor('a'))] 
+1

但'!='就像'==',即_vector scans_。相反,在[這個問題]中有一個_not join_ idiom(http://stackoverflow.com/questions/7920688/non-joins-with-data-tables)和[這個問題](http://stackoverflow.com/問題/ 7822138 /移植設定的操作,從-RS的數據幀到數據表,如何對識別-DUPL)。那些鏈接到一個功能請求使得非連接語法更容易。在這種情況下,它將是'df1 [ - 「a」]'。非聯接成語應該比矢量掃描更快。 – 2012-04-10 10:52:37

+0

是的,馬特,正如我懷疑的那樣,上述解決方案確實使用了矢量掃描,如果可能的話,我會盡量避免使用矢量掃描。在我的評論中,我仍然注意到速度增長與相似大小的data.frames相比,但我必須研究這是爲什麼。同時,你給了我正確的搜索條件和問題的替代形式,並且你清楚地理解了我所追求的。感謝您在這個偉大的軟件包上所做的所有努力。 – 2012-04-10 21:09:17

1

我只想讓那些不是「a」的所有鍵:

df1[!(group %in% "a")] 

這是否達到你想要什麼?

+2

或者,可替代地,'DF1 [!組= 「A」]'實現。我很想知道的是,我們兩個表達式之間是否存在重要的速度差異:'df1 [setdiff(unique(df1 $ group),「a」)]''''''df1 [letters [2:10]] '。 – 2012-04-03 15:55:09

+0

@ JoshO'Brien是的,我絕對走過這條複雜的道路;-)所以我會選擇Chase或你的解決方案。 – 2012-04-03 15:58:07

+0

謝謝大家,我感謝你的幫助。迄今爲止列出的所有解決方案都與我的數據大小相當,大約相當於使用data.frames的相似技術的兩倍。 – 2012-04-03 16:14:03

相關問題