大きなデータフレームが1つの列に多数あります。私は、データフレームを解析して、重複ごとに1つのエントリしか残さないようにしようとしています。すべてのエントリが重複していない限り、(第二部で助けたすべてのstackoverflowの答えを見つけることができませんでした...)R - dplyrでグループ化し、グループ内のすべてのメンバーが重複している場合にのみ重複を削除します。
例DFコード:
mydf <- data.frame(accession=c("A", "A", "A", "A", "B", "B", "C", "C", "D"), gene=c("unknown", "red1", "red2", "blue", "green1", "green2", "unknown", "unknown2", "violet"), ident=c(100.0, 95.3, 80.2, 65.1, 94.2, 100.0, 97.1, 90.0, 86))
DFは次のようになります。
accession gene ident
1 A unknown 100.0
2 A red1 95.3
3 A red2 80.2
4 A blue 65.1
5 B green1 94.2
6 B green2 100.0
7 C unknown 97.1
8 C unknown2 90.0
9 D violet 86.0
そして、私の所望の出力テーブルはこれです:
accession gene ident
2 A red1 95.3
6 B green2 100.0
7 C unknown 97.1
8 C unknown2 90.0
「既知の」gene
が最高のident
,のUNLESSの特定のaccession
のすべての重複したエントリに文字列unknown*
が含まれていることに基づいて、が保持されます。
unknown*
が含まれている場合は、にはすべての行を重複して保管しています。accession
これは私がこれまで持っているものです。
library(dplyr)
mydf$dup <- duplicated(mydf$accession, fromLast = FALSE)|duplicated(mydf$accession, fromLast = TRUE)
mydf <- mydf %>% group_by(accession) %>% mutate(count=n())
mydf <- subset.data.frame(mydf, mydf$dup == TRUE)
mydf <- mydf %>% group_by(accession) %>% filter(!grepl("unknown", gene)) %>% top_n(1,ident)
与える:
accession gene ident dup count
2 A red1 95.3 TRUE 4
6 B green2 100.0 TRUE 2
私の本能はif
声明を行うことです。
mydf <- mydf %>% group_by(accession) %>%
if(count(grepl("unknown", mydf$gene))!= mydf$count)
{filter(!grepl("unknown", gene))}
%>% top_n(1, ident)
が、私はエラーに実行しています:
Error in if (.) count(grepl("unknown", mydf$gene)) != mydf$count else { : argument is not interpretable as logical In addition: Warning message: In if (.) count(grepl("unknown", mydf$gene)) != mydf$count else { : the condition has length > 1 and only the first element will be used
corとはrect溶液?私は良い方法があれば、dplyrと結婚していない!ありがとう!
なぜアクセス権「D」が削除されますか? – Psidom
私は、重複した値を保持したいだけでした(この値は、私の実際のデータセットではさらに分析が必要です)。 Dは一意の値であるため、除外されます。 – moxed