子集数据框:识别出现x次的列组合?

时间:2014-02-19 18:43:37

标签: r dataframe subset

我知道有很好的创意子集工具,但我不熟悉它们,所以非常感谢您的帮助。我遇到了类似的问题但找不到答案,但如果您认为这是重复的,请指出我。

让我们假设df看起来像这样:

   Pop Loc BP
1    1   a 10
2    2   a 10
3    3   a 10
4    4   a 10
5    3   a 50
6    2   c 21
7    1   d 33
8    2   d  8
9    3   d  8
10   4   d  8

我想确定哪些Loc出现在Pop的所有4个级别中,但考虑Loc与BP结合使用(即在上面的示例中第5行和第3行不同) 。所需的输出应如下所示:

   Pop Loc BP
1    1   a 10
2    2   a 10
3    3   a 10
4    4   a 10

在此示例中,只有df的前4行符合条件,因为{1}}和Loc=="a"存在于Pop 1,2,3和4中。

应排除第3行,因为组合BP=="10"Loc=="a"仅存在于Pop 3中,而第7-10行不符合条件,因为BP==50和{{1在Pop 1中不存在。

解决方案必须具有通用性,或多或少有效,因为Loc=="d"BP==8的真实数据集长度(级别)约为4,000(Loc仍然很小)。

我正在考虑使用BP将“Poppaste()”合并到一个新列中,然后只保留那些显示所需次数的列(在此示例中为4个) )。但我确信有更好的方法。

由于

Loc创建BP

dput()

2 个答案:

答案 0 :(得分:1)

例如,使用plyr,您可以创建一个新ID(使用interaction),然后通过此ID处理您的比较:

library(plyr)
ddply(transform(df,id =interaction(Loc,BP)),.(id),
      function(x)if(all(1:4%in%x$Pop))x)

  Pop Loc BP   id
1   1   a 10 a.10
2   2   a 10 a.10
3   3   a 10 a.10
4   4   a 10 a.10

答案 1 :(得分:1)

使用基础R的非常通用的解决方案,您可以在其中指定分组列,所需值所在的列以及实际所需的值:

 subsetCustom <- function(
  data,
  INDICES,
  requiredValueCol,
  requiredValues)
{
  subsetData <- by(
    data = data,
    INDICES = INDICES,
    FUN = function(subdata, requiredValueCol, 
                   requiredValues) {
      if (all(requiredValues %in% subdata[, requiredValueCol])) 
        out <- subdata
      else out <- NULL
      return(out)
    },
    requiredValueCol = requiredValueCol,
    requiredValues = requiredValues)

  subsetData <- do.call(rbind, subsetData)
  return(subsetData)    
}

subsetCustom(
  data = df, 
  INDICES = list(df$Loc, df$BP),
  requiredValueCol = "Pop",
  requiredValues = 1:4)
相关问题