2017-05-17 2 views
1

次のようにIはRでデータフレームを持っている:NAsを除外しながら、データフレーム内で定義されたグループ化の行スライスを行う方法は?

df<-data.frame(id=rep(1:3,each=2),date=rep(c(NA,"date1","date2"),each=2),value=rep(c(4.1,9.4,5.6,6),c(2,2,1,1))) 
# id date value 
# 1 1 <NA> 4.1 
# 2 1 <NA> 4.1 
# 3 2 date1 9.4 
# 4 2 date1 9.4 
# 5 3 date2 5.6 
# 6 3 date2 6.0 

Iは1以上の行がある場合は、同じID、同じ日付と同じ値を有するように、データフレームから重複行を削除したいと思い、私は最初の行だけを取って、他の行を削​​除します。

私の最初の本能は、次の操作を行うことです。しかし

library(dplyr) 
df %>% group_by(id,date,value) %>% slice(1) 

、私は空の「日付」と行のslice(1)を無視することです

# id date value 
# 1 1 <NA> 4.1 
# 2 1 <NA> 4.1 
# 3 2 date1 9.4 
# 4 3 date2 5.6 
# 5 3 date2 6.0 

で何をしたいです。

どうすればいいですか?

答えて

1

我々はfilter

library(dplyr) 
df %>% 
    filter(is.na(date)|!duplicated(cbind(id, date, value))) 
# id date value 
#1 1 <NA> 4.1 
#2 1 <NA> 4.1 
#3 2 date1 9.4 
#4 3 date2 5.6 
#5 3 date2 6.0 

それともbase Rslice

df %>% 
    group_by(id,date,value) %>% 
    slice(unique(c(1, which(is.na(date))))) 
# A tibble: 5 x 3 
# Groups: id, date, value [4] 
#  id date value 
# <int> <fctr> <dbl> 
#1  1  NA 4.1 
#2  1  NA 4.1 
#3  2 date1 9.4 
#4  3 date2 5.6 
#5  3 date2 6.0 

とを使用することができ、我々はよりコンパクト

df[!duplicated(df) |is.na(df$date),] 
# id date value 
#1 1 <NA> 4.1 
#2 1 <NA> 4.1 
#3 2 date1 9.4 
#5 3 date2 5.6 
#6 3 date2 6.0 
012これを行うことができます
+0

'base R'の例では、' duplicated'の引数を 'df'から' cbind(id、date、value) 'に置き換えようとしましたが、動作しませんでした。何故ですか? – HNSKD

+1

@HNSKD 'id'、' date'オブジェクトが個別に作成されていない場合、 'df 'の環境の中にあるので、動作しません。あなたは 'cbind(d $ id、d $ date、...'または 'df [!duplicated(df、cbind(id、date、value)))| is.na(df $ date) ] ' – akrun

関連する問題