我有一个类似于以下内容的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
然而,我有400个人口,大小从5到155个人不等 手动挑选人口名称是不可行的。我想写一个 功能,我在本质上说“给我一个包含所有人口的数据集 由X个人或更多个人组成,并删除少于或少于 X.“感谢任何帮助或反馈。
答案 0 :(得分: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
答案 1 :(得分: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], ]
答案 2 :(得分: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
)的群组(来自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), ]