在除数据列之外的所有列中查找数据框中的重复组

时间:2012-12-13 09:59:42

标签: r dataframe

我有一个大型数据框。出于某些目的,我需要执行以下操作:

  • 在此数据框中选择一列
  • 迭代除选定列
  • 之外的给定数据框的所有行
  • 选择除了一个选定列
  • 之外的所有元素相等的此数据框的所有行
  • 按组名称为行索引的方式对它们进行分组,组值为重复行的索引。

我已为此任务编写了一个函数,但由于嵌套循环,它的工作速度很慢。我想知道如何改进这些代码。

假设我们有这样的数据框:

  V1 V2 V3 V4
1  1  2  1  2
2  1  2  2  1
3  1  1  1  2
4  1  1  2  1
5  2  2  1  2

我们希望将此列表作为输出:

diff.dataframe("V2", conf.new, conf.new)

输出继电器:

$`1`
[1] 1

$`2`
[1] 2

$`3`
[1] 1 3

$`4`
[1] 2 4

$`5`
[1] 5

以下代码重新实现目标,但效果太慢。是否有可能以某种方式改善它?

diff.dataframe <- function(param, df1, df2){
  excl.names <- c(param)
  df1.excl <- data.frame(lapply(df1[, !names(df1) %in% excl.names], as.character), stringsAsFactors=FALSE)
  df2.excl <- data.frame(lapply(df2[, !names(df2) %in% excl.names], as.character), stringsAsFactors=FALSE)
  list.out <- list()

  for (i in 1:nrow(df1.excl)){
     for (j in 1:nrow(df2.excl)){
        if (paste(df1.excl[i,],collapse='') == paste(df2.excl[j,], collapse='')){
          if (!as.character(i) %in% unlist(list.out)){                                                                                                                             
            list.out[[as.character(i)]] <- c(list.out[[as.character(i)]], j)                                                                                                       
          }
        }
     }
  }
  return(list.out)
}

1 个答案:

答案 0 :(得分:1)

让我们先生成一些数据

df <- as.data.frame(matrix(sample(2, 20, TRUE), 5))

# Produces df like this
  V1 V2 V3 V4
1  2  1  1  1
2  2  1  2  2
3  1  1  2  2
4  1  2  1  1
5  1  2  1  1

然后我们使用lapply遍历这些行。然后将每行idf的所有行apply(包括其自身)进行比较。 &lt; = 1差异的行返回TRUE,其他行返回FALSE生成逻辑向量,我们将其转换为which的数字向量。

lapply(1:nrow(df), function(i)
    apply(df, 1, function(x) which(sum(x != df[i,]) <= 1)))

# Produces output like this
[[1]]
[1] 1

[[2]]
[1] 2 3

[[3]]
[1] 2 3

[[4]]
[1] 4 5

[[5]]
[1] 4 5