簡體   English   中英

嵌套循環,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 

通過使用Ryan建議的table()函數對外觀進行計數,可以實現相同的目的。 在這里,對計數進行過濾以僅保留那些出現兩次或兩次以上的條目。

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

請注意,這與Ryan的解決方案不同,后者僅保留其值最常出現的行。 即使是平局,也只能選擇一個值。 (對於給定的小樣本數據集,兩種方法都返回相同的結果。)

可以用更簡潔的方式重寫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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM