【问题标题】:Nested for loops, different in R嵌套 for 循环,在 R 中不同
【发布时间】:2019-01-10 11:27:52
【问题描述】:

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

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

【问题讨论】:

  • 和什么不一样?
  • @Ryan Col1 的所有名称本质上应该具有相同的名称。因此,对于我的示例,它只是所有名为 PBR565 的。
  • 你可以做d3[d3$Col1 == 'PBR565',]
  • 或者t &lt;- table(d3$Col1); d3[d3$Col1 == names(t)[which.max(t)],],如果你想保留最频繁出现的值
  • d3[duplicated(d3$Col1) | duplicated(d3$Col1, fromLast = TRUE), ] 将删除Col1 仅出现一次的所有行。

标签: r for-loop nested-loops


【解决方案1】:

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

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

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

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

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)

【讨论】:

    猜你喜欢
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2015-01-28
    相关资源
    最近更新 更多