5

次のような data.frame があります。

df <- data.frame(population = c("AA","AA","AA","BB","BB","CC","CC","CC"),
                 individual = c("A1","A2","A3","B1","B2","C1","C2","C3"),
                 Haplotype1 = rep(1:4,2),
                 Haplotype2 = rep(5:8,2))
 > df
  population individual Haplotype1 Haplotype2
1         AA         A1          1          5
2         AA         A2          2          6
3         AA         A3          3          7
4         BB         B1          4          8
5         BB         B2          1          5
6         CC         C1          2          6
7         CC         C2          3          7
8         CC         C3          4          8

指定された数に満たない個人で構成される母集団がデータセットから除外された新しいデータセットを作成したいと考えています。たとえば、個人が 3 人以上いる母集団のみのデータを再分析したいと考えています。これは私が欲しいデータセットです:

> df <- df[!df$population=="BB",]
> df
  population individual Haplotype1 Haplotype2
1         AA         A1          1          5
2         AA         A2          2          6
3         AA         A3          3          7
6         CC         C1          2          6
7         CC         C2          3          7
8         CC         C3          4          8

しかし、私は 5 から 155 個体のサイズの範囲の 400 の個体群を持っており、個体群を名前で手動で選択することは現実的ではありません。本質的に「X 人以上の個人からなるすべての集団を含むデータセットを提供し、X 未満の個人を削除する」という関数を書きたいと思います。ヘルプやフィードバックをいただければ幸いです。

4

3 に答える 3

4

これでうまくいくはずです:

tab <- table(df$population) > 2
df[df$population %in% names(tab)[tab], ]

#   population individual Haplotype1 Haplotype2
# 1         AA         A1          1          5
# 2         AA         A2          2          6
# 3         AA         A3          3          7
# 6         CC         C1          2          6
# 7         CC         C2          3          7
# 8         CC         C3          4          8
于 2012-10-25T14:02:47.857 に答える
3

これも同様に機能します:

lens <- tapply(df$population , df$population, length)
df[df$population %in% names(lens)[lens > 2], ]

編集:mrdwabの鋭い読書ごとに、回答を編集しました。入力と出力のみを見たことを認めなければなりません。

lens <- tapply(df$individual, df$population, function(x) length(unique(x)))
df[df$population %in% names(lens)[lens > 2], ]
于 2012-10-25T14:07:12.923 に答える
3

私が考えることができる最も直接的なアプローチはdata.table()、「data.table」パッケージから使用することです:

library(data.table)
DT <- data.table(population = c("AA","AA","AA","BB","BB","CC","CC","CC"),
                 individual = c("A1","A2","A3","B1","B2","C1","C2","C3"),
                 Haplotype1 = rep(1:4,2), Haplotype2 = rep(5:8,2),
                 key = "population")
## Or, convert your existing data.frame "df" to data.table:
## DT <- data.table(df, key = "population")
DT[, .SD[length(unique(individual)) >= 3], by = key(DT)]
#    population individual Haplotype1 Haplotype2
# 1:         AA         A1          1          5
# 2:         AA         A2          2          6
# 3:         AA         A3          3          7
# 4:         CC         C1          2          6
# 5:         CC         C2          3          7
# 6:         CC         C3          4          8

アップデート

これがあなたにとって重要かどうかはわかりませんが、Tyler と Sven の現在のソリューションでは、投稿した質問のデータによると出力は正しいものの、実際には潜在的に欠陥のある考え方が行われていることに注意してください。 .

df$population私が「潜在的に」と書いているのは、あなたが ( からの) 3 人以上の個人がいるグループ ( から ) を探していると述べているからですdf$individualただし、どちらのソリューションも現在、人口の長さのみを調べていますが、実際の質問では、人口によって言及された一意の個人の数が必要であると想定していました。

簡単な例を次に示します。元の「df」を使用して、行 3 の個人を「A2」に変更します ( df[3, 2] <- "A2")。ここで、質問の基準に従って、次の行のみをpopulation == "CC"返す必要があります。

あなたのデータにすでに固有の個人しか含まれていない場合は問題ありませんが、それについて言及することにしました ;)


このロジックを考慮したベース R ソリューションは次のとおりです。

uniqueIndividuals <- ave(as.character(df$individual), 
                         df$population, FUN = function(x) length(unique(x)))
df[which(as.numeric(uniqueIndividuals) >= 3), ]
于 2012-10-25T16:40:27.690 に答える