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

col*_*lin 2 r

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

a <- rnorm(10)
b <- rnorm(10)
c <- a
d <- rnorm(10)
dat <- data.frame(a,b,c,d)
Run Code Online (Sandbox Code Playgroud)

人们已经回答了如何测试,如果在数据帧的两个单独列是相同的位置。但是,我希望有一种方法可以将每列与其他列进行对照。

mar*_*kus 5

caret软件包包含findLinearCombos您可能想要尝试的功能

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


#$remove
#[1] 3
Run Code Online (Sandbox Code Playgroud)

但是请注意,该函数还建议删除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
Run Code Online (Sandbox Code Playgroud)


Ice*_*can 5

您可以使用combn获取所有列号对,然后应用于结果矩阵以检查所有元素是否相等。

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

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

pairs[same,]
# [1] 1 3
Run Code Online (Sandbox Code Playgroud)

或检查相关性(还将包括线性组合)

cor1 <- data.frame(which(cor(dat) == 1, arr.ind = T))
cor1[cor1$row > cor1$col,]
#   row col
# c   3   1
Run Code Online (Sandbox Code Playgroud)