通过除某一列外的所有列,在数据框中查找重复组。

4
我有一个大的数据框,出于某些目的,我需要执行以下操作:
  • 选择此数据框中的一列
  • 遍历给定数据框除所选列之外的所有行
  • 选择此数据框中除一个选择的列外所有元素相等的行
  • 通过组名称是行索引,组值是重复行的索引来分组它们。
我已经为此任务编写了一个函数,但由于嵌套循环,它运行缓慢。我希望能得到一些关于如何改进这段代码的想法。
假设我们有这样一个数据框:
  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)
}

2
我理解你的函数是可以工作的,但你想要提高速度,对吗?不过我无法弄清楚如何运行它,所以如果你能提供一个小的示例数据集和期望的输出,那将会很有帮助,这样我们就可以验证我们的解决方案。请粘贴 dput(df1)dput(df2) 的输出,并展示函数的调用。 - Backlin
请发布样本数据和期望结果。 - Andrie
第一行为什么与第三行匹配,但第三行却不与第一行匹配? - Backlin
1个回答

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 循环遍历每一行。然后使用 apply 将每一行 idf 的所有行(包括它自己)进行比较。差异小于等于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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接