2017-05-23 18 views
0

データをIDでグループ化し、条件に基づいて最初の行をスライスしたいとします。行の条件付きifelse

私は、次のデータセットがあります。

head(data) 

    ID Cond1 
    A 10 
    A 10 
    B 20 
    B 30 

を、私は条件に基づいて行をスライスしたい:

  • COND1の値が両方の行に対して一意である場合は、それらを保ちます。
  • Cond1の値が重複している場合は、一番上の行を維持します。

+0

質問@Jaap重複していない、実際には別の(あなたがそれを読んだことがある場合) – akrun

+0

@Jaapです。しかし、否定的な評判に感謝します。 – Prometheus

+0

@Prometheus私は質問をクローズしました。私はdownvoteしなかった。問題は現在立っているので、それは重複している。そうでないと思われる場合は、質問を明確にして更新してください。 – Jaap

答えて

2

我々はfilter

library(dplyr) 
data %>% 
    group_by(ID) %>% 
    filter(n_distinct(Cond1)==n()| row_number()==1) 

またはOPのポストでの説明に基づいてちょうど

data[!duplicated(data),] 
# ID Cond1 
#1 A 10 
#3 B 20 
#4 B 30 

n_distinctを使用することができ、我々はB 20で別の行が含まれている場合、最初の解決策を与えるべきである

data %>% 
    group_by(ID) %>% 
    filter(n_distinct(Cond1)==n()| row_number()==1) 
# A tibble: 2 x 2 
# Groups: ID [2] 
#  ID Cond1 
# <chr> <int> 
#1  A 10 
#2  B 20 
3

このような基地R関数aveを使用することができます。

datafr[!(ave(datafr$Cond1, datafr$ID, FUN=duplicated)),] 
    ID Cond1 
1 A 10 
3 B 20 
4 B 30 

aveそうでない場合COND1の要素は複製され、0であれば1とIDによって数値ベクトルを返します。 !は2つの役割を果たします。まず、結果のベクトルをサブセットに適した論理ベクトルに変換します。次に、重複しない要素を保持して結果を逆にします。

data.tableでは、結合を使用できます。

setDT(datafr)[datafr[, !duplicated(Cond1), by=ID]$V1] 
    ID Cond1 
1: A 10 
2: B 20 
3: B 30 

内側data.frameはIDによって重複しない要素の論理を返し、$V1介してベクターに引き出されます。この論理ベクトルは、元のデータテーブルに供給され、部分集合を実行する。

データ

datafr <- 
structure(list(ID = c("A", "A", "B", "B"), Cond1 = c(10L, 10L, 
20L, 30L)), .Names = c("ID", "Cond1"), row.names = c(NA, -4L), class = "data.frame")