删除属于指定长度因子的数据集的行

时间:2012-10-25 13:42:18

标签: r

我有一个类似于以下内容的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.“感谢任何帮助或反馈。

3 个答案:

答案 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), ]