データをIDでグループ化し、条件に基づいて最初の行をスライスしたいとします。行の条件付きifelse
私は、次のデータセットがあります。
今head(data)
ID Cond1
A 10
A 10
B 20
B 30
を、私は条件に基づいて行をスライスしたい:
- COND1の値が両方の行に対して一意である場合は、それらを保ちます。
- Cond1の値が重複している場合は、一番上の行を維持します。
データをIDでグループ化し、条件に基づいて最初の行をスライスしたいとします。行の条件付きifelse
私は、次のデータセットがあります。
今head(data)
ID Cond1
A 10
A 10
B 20
B 30
を、私は条件に基づいて行をスライスしたい:
我々は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
このような基地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")
質問@Jaap重複していない、実際には別の(あなたがそれを読んだことがある場合) – akrun
@Jaapです。しかし、否定的な評判に感謝します。 – Prometheus
@Prometheus私は質問をクローズしました。私はdownvoteしなかった。問題は現在立っているので、それは重複している。そうでないと思われる場合は、質問を明確にして更新してください。 – Jaap