我有一个数据框,可能有几个重复的列。 我想做两件事(以下是一个可重复的例子,在实践中我有几十列):
首先,提取唯一列。这可以通过以下命令有效地完成:
library(dplyr)
df = data_frame(x = rnorm(100), y = rnorm(100), z = y, w = x)
df[!duplicated(as.list(df))]
这会输出x
和y
列。
接下来,我想具体找到哪个是x
(w
)的副本,哪个是y
(z
)的副本。我怎样才能有效地做到这一点?
答案 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的对。