我有一个100行和65列的数据帧(称为crossID)。此数据框可以包含重复项,但这些重复项是连续的(我的意思是,如果第31行有重复项,则副本将位于第32行,并且仅在那里)。
我只是想提取非重复的行并将它们复制到一个新的数据帧中(我称之为crossID_clean)。我想提取重复的行并将它们放在另一个数据帧中(我称之为crossDup)
我写了这段代码:
crossID_clean = data.frame()
crossDup = data.frame()
for (i in 1:nrow(crossID)){
if(crossID[i,1] != crossID[i+1,1]){
crossID_clean = rbind(crossID_clean, crossID[i,])
ncross=ncross+1 #good crossmatches
}else{
crossDup = rbind(crossDup, crossID[i,]) #List of duplicated crossmatches
ndel = ndel+1 #objects deleted because having more than one crossmatch
}
}
以错误结束:
Error in rbind(deparse.level, ...) :
numbers of columns of arguments do not match
我不知道问题出在哪里,因为这两个新的数据帧没有指定的列,所以我认为不存在“列数”的问题......
我阅读了如何在循环中创建数据框以及如何将行附加到其他帖子中的新数据框,但我发现的所有内容都是在使用1个数据框时(如在writing to a dataframe from a for-loop in R中),而不是通过两个或更多数据帧。对不起,如果已有帖子了。我非常感谢你的帮助。
感谢。
答案 0 :(得分:1)
为什么不使用duplicated
?
set.seed(3)
L3 <- LETTERS[1:3]
d <- data.frame(
v1 = sample(L3, 10, replace = TRUE),
v2 = sample(L3, 10, replace = TRUE),
v3 = sample(L3, 10, replace = TRUE)
)
d_dupl <- d[duplicated(d[,1]),]
d_nondupl <- d[!duplicated(d[,1]),]
答案 1 :(得分:0)
对于数据帧d,如何:
unique(d) # uniques
d[duplicated(d),] # duplicates
或者很明显,如果您确实想根据代码(或“i”列)仅根据第一列提取,但不确定为什么会有用
d[unique(d[,1]),]
d[duplicated(d[,1]),]