检查数据框中的任何列在R中是否相同

检查数据框中的任何列在R中是否相同,r,R,我迭代地将模型拟合到许多不同的变量,在少数情况下,我用作自变量的两列包含一组相同的值。这会使模型无法识别并抛出错误。我想要一种方法来检查是否有任何列与dataframe中的任何其他列相同,然后返回有问题的列的名称。下面是一个数据帧示例 a <- rnorm(10) b <- rnorm(10) c <- a d <- rnorm(10) dat <- data.frame(a,b,c,d) a插入符号caret包包含您可能想要尝试的函数findLinearComb

我迭代地将模型拟合到许多不同的变量,在少数情况下,我用作自变量的两列包含一组相同的值。这会使模型无法识别并抛出错误。我想要一种方法来检查是否有任何列与dataframe中的任何其他列相同,然后返回有问题的列的名称。下面是一个数据帧示例

a <- rnorm(10)
b <- rnorm(10)
c <- a
d <- rnorm(10)
dat <- data.frame(a,b,c,d)

a插入符号
caret
包包含您可能想要尝试的函数
findLinearCombos

caret::findLinearCombos(dat)
#$linearCombos
#$linearCombos[[1]]
#[1] 3 1


#$remove
#[1] 3

但是请注意,该函数还建议删除
a
乘以-1的列

第二个例子

dat2 <- data.frame(a,b,c,d, e = -a) 
caret::findLinearCombos(dat2)
#$linearCombos
#$linearCombos[[1]]
#[1] 3 1

#$linearCombos[[2]]
#[1] 5 1


#$remove
#[1] 3 5

dat2您可以使用
combn
获取所有列编号对,然后应用于生成的矩阵以检查所有元素是否相等

pairs <- t(combn(seq_len(ncol(dat)), 2))

same <- apply(pairs, 1, function(x) all(Reduce(`==`, dat[,x])))

pairs[same,]
# [1] 1 3

pairs您可以使用
dist
函数计算列之间的距离矩阵,并找到距离为0的列组合

m = as.matrix(dist(t(dat)))
m[upper.tri(m,diag=T)] = NA
which(m<1.5e-8,arr.ind=T)

  row col
c   3   1
m=as.matrix(dist(t(dat)))
m[上三角(m,对角线=T)]=NA
哪个(m
m = as.matrix(dist(t(dat)))
m[upper.tri(m,diag=T)] = NA
which(m<1.5e-8,arr.ind=T)

  row col
c   3   1