![](/img/trans.png)
[英]How to reference 2 different dataframes without using nested loops in 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.