【问题标题】:Copy specific rows of a dataframe to a new dataframe, using FOR loop in R使用 R 中的 FOR 循环将数据帧的特定行复制到新数据帧
【发布时间】:2013-12-05 16:15:59
【问题描述】:

我有一个 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),而不是通过玩两个或更多数据框。对不起,如果已经有这个帖子。非常感谢您的帮助。

谢谢。

【问题讨论】:

  • 就像在 R 中经常出现的情况一样,for 循环不是解决这个问题的好方法,您可以使用一个专门的函数。阅读help("duplicated")

标签: r


【解决方案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) 从他的代码来看,他似乎只考虑了识别重复项的第一个字段
  • 非常感谢,它运行得非常好而且速度非常快 :) 但是,我仍然很想知道我的代码有什么问题,为什么会出现这个错误。只是为了了解我自己的错误!任何想法将不胜感激,但再次感谢您的建议。
  • 看不到您的数据,无法确定,但请尝试将 crossID_clean = data.frame() crossDup = data.frame() 替换为 crossID_clean = crossID[0,] crossDup = crossID[0,]。另外,如果它解决了问题,请考虑接受答案。
  • 我试过你告诉我的,但它给出了同样的错误。我知道不看数据要困难得多,但我认为在这种情况下,只放其中的一个子集(因为它太大了)不会有太大帮助。别担心,您的解决方案运行良好,而且非常干净整洁。再次感谢!
【解决方案2】:

对于数据帧d,如何:

unique(d)           # uniques
d[duplicated(d),]   # duplicates

或者显然,如果您确实想根据代码(或“i”列)仅根据第一列提取,但不确定为什么会有用

d[unique(d[,1]),]
d[duplicated(d[,1]),]

【讨论】:

  • 谢谢特洛伊。正如我上面所说,它与“重复”完美配合。指定列的事实是,就我的数据而言,足以验证第一列中的值是否重复。在某些情况下,其余列不能相等,但我不在乎。
猜你喜欢
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
相关资源
最近更新 更多