嵌套 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)
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], ]
请注意,这与
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)