R:在多列中查找模式 - 可能重复()?

时间:2010-11-10 02:59:08

标签: r

我正在尝试隔离数据框中具有共同值的条目:请参阅下文以重建我的df的一部分:

Stand<-c("MY","MY","MY","MY","MY")
Plot<-c(12,12,12,12,12)
StumpNumber<-c(1,2,3,3,7)
TreeNumber<-c(1,2,3,4,8)
sample<-data.frame(Stand,Plot,StumpNumber,TreeNumber)
sample

获取一个输出,告诉我哪些条目具有共同的值。换句话说,为了给定的Stand,Plot,StumpNumber组合快速隔离存在多个TreeNumber(或多于一行)的情况。在示例代码中,StumpNumber 3具有TreeNumber 3和TreeNumber 4.

我对duplicated()的理解是可以找到在一列中出现重复值的实例 - 我该怎么做才能找到常见的列组合出现的情况?

感谢。

2 个答案:

答案 0 :(得分:5)

?duplicated的描述表明它适用于data.frames行,而Details部分的第四段表示:

 The data frame method works by pasting together a character
 representation of the rows separated by ‘\r’, so may be imperfect
 if the data frame has characters with embedded carriage returns or
 columns which do not reliably map to characters.

您是如何理解它只适用于单列的?

假设TreeNumberStandPlotStumpNumber中是唯一的,您只需要将其排除在duplicated的调用之外。

> duplicated(sample[,1:3])
[1] FALSE FALSE FALSE  TRUE FALSE
> duplicated(sample[,1:3], fromLast=TRUE)
[1] FALSE FALSE  TRUE FALSE FALSE

更新 - 如果您想要所有重复的行,您可以执行以下操作:

> allDups <- duplicated(sample[,1:3],fromLast=TRUE) | duplicated(sample[,1:3])
> sample[allDups,]
  Stand Plot StumpNumber TreeNumber
3    MY   12           3          3
4    MY   12           3          4

答案 1 :(得分:0)

为方便起见,我假设您正在进行嵌套计划。因此,假设Trees嵌套在Stumps中,Stumps嵌套在Plots中,Plots嵌套在Stands中。我还假设你要解决的问题是一些树被附加到同一个树桩,这意味着有问题的条目是重复Stand / Plot / Stump个标识符的条目对于不同的TreeNumber s

我做的是:

  • 订购数据
  • 围绕duplicated()
  • 包装略微自定义的功能
  • 使用ddply()(在plyr包中)分割和分析您的数据
  • 打印有问题的条目

订购数据

我首先按Stand订购,然后Plot订购,最后StumpNumber订购

    sampleOrdered <- sample[order(sample$Stand, sample$Plot, sample$StumpNumber)]

包装我自己的duplicated()函数

假设问题是某些树附着在同一个树桩上,我们可以编写以下函数:

    findTreesAttachedToTheSameStump <- function(data) {
        x <- duplicated(data[ , "StumpNumber"])
        data[x, ]
    }

此函数将选择并返回(隐式)通过duplicated()测试的任何条目。

使用ddply

我在这里做了一点split-apply-combine。我指示ddplyStandPlot拆分数据集(因为您的数据是嵌套的,而StumpNumber可能只是在图中唯一)。然后,我应用上面创建的函数:

    sampleDuplicated <- ddply(sampleOrdered, .(Stand, Plot), findTreesAttachedToTheSameStump)

打印出有问题的树桩

现在我们需要做的就是调用sampleDuplicated,其中包含重复的每个Plot / Stand / Stump组合的条目。