嵌套 for 循环,在 R 中不同

Nested for loops, different in 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

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

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

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

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

请注意,这与 不同,后者仅保留值出现最频繁的行。仅选择一个值,即使是平局也是如此。 (对于给定的小样本数据集,两种方法 return 相同的结果。)

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)