哪一列是重复列的副本?

时间:2018-05-30 13:39:35

标签: r duplicates

我有一个数据框,可能有几个重复的列。 我想做两件事(以下是一个可重复的例子,在实践中我有几十列):

首先,提取唯一列。这可以通过以下命令有效地完成:

library(dplyr)
df = data_frame(x = rnorm(100), y = rnorm(100), z = y, w = x)
df[!duplicated(as.list(df))]

这会输出xy列。

接下来,我想具体找到哪个是xw)的副本,哪个是yz)的副本。我怎样才能有效地做到这一点?

2 个答案:

答案 0 :(得分:2)

您可以使用combn获取列之间的所有组合。一旦你有了这个,就有各种各样的指标来捕捉平等。既然你正在处理浮点数,我建议使用相关性。如果它是1那么2列是相同的,即

setNames(combn(df, 2, FUN = function(i) all(cor(i) == 1)), 
         combn(names(df), 2, FUN = toString))

# x, y  x, z  x, w  y, z  y, w  z, w 
#FALSE FALSE  TRUE  TRUE FALSE FALSE  

如果相关性不够,那么我们也可以在那里添加方差,即

setNames(combn(df, 2, FUN = function(i) all(cor(i) == 1) & length(unique(as.vector(var(i)))) == 1), 
         combn(names(df), 2, toString))

# x, y  x, z  x, w  y, z  y, w  z, w 
#FALSE FALSE  TRUE  TRUE FALSE FALSE 

您可以按照自己的方式构建输出。

答案 1 :(得分:2)

非常类似于@Sotos提供的答案

library(dplyr)

# example data
df = data_frame(x = rnorm(100), y = rnorm(100), z = y, w = x)

# function to compare vectors
f = function(x,y) { all(df[,x] == df[,y]) }

# vectorise function
f = Vectorize(f)


data.frame(t(combn(names(df),2)), stringsAsFactors = F) %>%
  mutate(flag = f(X1, X2))

#   X1 X2  flag
# 1  x  y FALSE
# 2  x  z FALSE
# 3  x  w  TRUE
# 4  y  z  TRUE
# 5  y  w FALSE
# 6  z  w FALSE

然后,您可以专注于标志为TRUE的对。