首页 > 解决方案 > 嵌套 for 循环,在 R 中不同

问题描述

d3:

Col1     Col2
PBR569   23
PBR565   22
PBR565   22
PBR565   22

我正在使用这个循环:

for ( i in 1:(nrow (d3)-1) ){
    for (j in (i+1):nrow(d3)) {
      if(c(i) == c(j)) {
        print(c(j))
        # d4 <- subset.data.frame(c(j))
      }
    }
  }

我想比较 Col1 中的所有行并消除不一样的行。然后我想输出一个数据框,其中只有在 col1 中具有相同值的数据框。

预期输出:

    Col1     Col2
    PBR565   22
    PBR565   22
    PBR565   22

不确定我的嵌套循环怎么了?是因为我没有指定列名吗?

标签: rfor-loopnested-loops

解决方案


OP 已要求比较其中的所有行Col1并消除不相同的行。

如果我理解正确,OP 希望删除其中值Col1仅出现一次的所有行,并仅保留值出现两次或更多次的那些行。

这可以通过在 中查找重复值来完成Col1。该duplicated()函数将值的第二次和后续出现标记为重复。因此,我们需要向前和向后扫描,并结合两个结果:

d3[duplicated(d3$Col1) | duplicated(d3$Col1, fromLast = TRUE), ]
    Col1 Col2
2 PBR565   22
3 PBR565   22
4 PBR565   22

同样可以通过使用Ryantable()建议的函数计算出现次数来实现。在这里,计数被过滤以仅保留那些出现两次或多次的条目。

t <- table(d3$Col1)
d3[d3$Col1 %in% names(t)[t >= 2], ]

请注意,这与Ryan 的解决方案不同,后者仅保留值最常出现的行。即使在平局的情况下,也只会选择一个值。(对于给定的小样本数据集,两种方法都返回相同的结果。)

瑞恩的答案可以用更简洁的方式重写

d3[d3$Col1 == names(which.max(t)), ]

数据

d3 <- data.table::fread(
"Col1     Col2
PBR569   23
PBR565   22
PBR565   22
PBR565   22", data.table = FALSE)

推荐阅读