2016-08-22 5 views
2

DFを使用してRの行を削除: -data.table

Date Name Salary 
Q1 2015 ABC $10 
Q2 2015 ABC $11 
Q3 2015 ABC $15 
Q1 2015 XYZ $25 
Q2 2015 XYZ $20 

Iは、その合計の周波数データから行を削除するには、例えばについては3未満でありますXYZは、2の周波数を持っているので、私は4行目を削除すると5

test <- setDT(df)[,.I[.N>2],by=Name] 

出力: -

> test 
    Name V1 
1: ABC 1 
2: ABC 2 
3: ABC 3 

フィルタリングが正しく行われているが、私は、全体のデータセットを得ることはありません、I出力ではName列のみを取得します。

答えて

4

'V1'列を抽出し、 'i'の行インデックスとして使用して行をサブセット化する必要があります。

setDT(df)[df[,.I[.N>2],by=Name]$V1] 
#  Date Name Salary 
#1: Q1 2015 ABC $10 
#2: Q2 2015 ABC $11 
#3: Q3 2015 ABC $15 

それともifと簡潔なオプションと

setDT(df)[, if(.N >2) .SD, by = Name] 
# Name Date Salary 
#1: ABC Q1 2015 $10 
#2: ABC Q2 2015 $11 
#3: ABC Q3 2015 $15 

.SD念のため、私たちはdplyr方法が必要な場合

library(dplyr) 
df %>% 
    group_by(Name) %>% 
    filter(n() >2) 
#  Date Name Salary 
#  <chr> <chr> <chr> 
#1 Q1 2015 ABC $10 
#2 Q2 2015 ABC $11 
#3 Q3 2015 ABC $15 

またはbase Rと、私たちは、私は `.SD`の方法は、最初の項目ごとに、今効率的である疑いがあるオプションの数、ave

df[with(df, ave(seq_along(Name), Name, FUN = length)>2),] 

またはtable

tbl <- table(df$Name)> 2 
subset(df, Name %in% names(tbl)[tbl]) 
+1

を使用してのものを持つことができますhttps://github.com/Rdatatable/data.table/issues/735で私はそれを誤読しているかもしれないと思うが...それが成立しているかどうかを知ることは興味がある。 – Frank

+1

@Frank私はdevelバージョンを使用しています。最近、いくつかのベンチマークを行うことは '.I'オプションに有利です。 – akrun