我有1个名为A的数据框,其中有5000列。我如何在这个data.frame中找到彼此相等的列。在一个data.frame中查找具有相同数据的列
回答
正如@John所述,使用duplicated
时出现问题。我会补充说,在与duplicated
比较之前,将data.frame强制转换为相同的数据类型。在一个例子,这里是一个data.frame:
df <- data.frame(a = LETTERS[1:3],
b = 1:3,
c = as.character(1:3),
d = LETTERS[1:3],
e = 1:3,
f = 1:3)
df
# a b c d e f
# 1 A 1 1 A 1 1
# 2 B 2 2 B 2 2
# 3 C 3 3 C 3 3
注意,列c
非常相似e
列b
,和f
,但不是因为不同类型的相同(字符与数字)。 @Jubbles建议的解决方案将忽略这些差异。
相反,在data.frame的列上使用identical
函数似乎更合适。您可以比较使用outer
两个由两列:
are.cols.identical <- function(col1, col2) identical(df[,col1], df[,col2])
identical.mat <- outer(colnames(df), colnames(df),
FUN = Vectorize(are.cols.identical))
identical.mat
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] TRUE FALSE FALSE TRUE FALSE FALSE
# [2,] FALSE TRUE FALSE FALSE TRUE TRUE
# [3,] FALSE FALSE TRUE FALSE FALSE FALSE
# [4,] TRUE FALSE FALSE TRUE FALSE FALSE
# [5,] FALSE TRUE FALSE FALSE TRUE TRUE
# [6,] FALSE TRUE FALSE FALSE TRUE TRUE
在这里,您可以使用集群来识别相同的列组(可能有更好的方法,所以如果您知道的,随意评论,甚至编辑我的答案)
library(cluster)
distances <- as.dist(!identical.mat)
tree <- hclust(distances)
cut <- cutree(tree, h = 0.5)
cut
# [1] 1 2 3 1 2 2
split(colnames(df), cut)
# $`1`
# [1] "a" "d"
#
# $`2`
# [1] "b" "e" "f"
#
# $`3`
# [1] "c"
编辑1:忽视的浮点值的差异,可以使用
are.cols.identical <- function(col1,col2) isTRUE(all.equal((df[,col1],df[,col2]))
编辑2:比聚类进行分组相同列的名称更有效的方法是
cut <- apply(identical.mat, 1, function(x)match(TRUE, x))
split(colnames(df), cut)
如何转置数据帧并使用duplicated()
?
B <- as.data.frame(t(A))
dup1 <- duplicated(B)
# if you want to identify all duplicated rows
dup2 <- duplicated(B, fromLast = TRUE)
dup_final <- dup1 * dup2
saved_colnames <- colnames(A)[dup_final]
我需要保存列的名字... – 2012-04-21 13:07:12
@大卫Kakauridze后使用:我认为我添加的最后一行应该注意这一点。 – Jubbles 2012-04-21 13:09:03
duplicateated()命令会将每个值视为文本。在某些情况下某些值可能被认为是相等的,但不能被视为文本(甚至不是以其自然形式)。例如,许多0的值将不会如此表示(例如,tan(pi))。浮点数可能是一个严重的问题。对于提问者的情况可能没问题,但应该警告未来的读者,这不是一个通用的解决方案。(并没有一个通用的解决方案没有一个更复杂的功能) – John 2012-04-21 14:09:46
这个问题是非常类似于一个here,但与用相同的警告细微的差别。
我将在下面使用digest()
,如(感谢@flodel的data.frame和上面一个非常好的建议)
df <- data.frame(a = LETTERS[1:3],
b = 1:3,
c = as.character(1:3),
d = LETTERS[1:3],
e = 1:3,
f = 1:3)
dfDig <- sapply(df, digest)
ansL <- lapply(seq_along(dfDig), function(x) names(which(dfDig == dfDig[x])))
unique(ansL)
# [[1]]
# [1] "a" "d"
# [[2]]
# [1] "b" "e" "f"
# [[3]]
# [1] "c"
这仍然不会1.0
和1
区分再次建议,但是。
编辑
如由@flodel的意见建议,下面可以交替创建dfDig
- 1. 查找在data.frame相隔一列字符“”
- 2. 在熊猫数据框中查找具有相同列值的行
- 3. 查询中的列不具有在另一列的值相同
- 4. 如何查找在Solr中具有相同值的两列
- 5. 在MySQL列中查找具有相同值的行
- 6. 强制多个表在数据库中具有相同的列
- 7. SQL查找相同的列数据
- 8. NHibernate查询查找具有一些相同的列和一个表中的一些不同的记录
- 9. 查找具有两个相似列和一个不同的重复项
- 10. 在单独的阵列中查找具有相同值的两个字段
- 11. 比较两个data.frames找到data.frame 1具有在选定的列
- 12. 从多个表中选择具有相同列名的数据
- 13. HighChart中具有相同xAxis数据的几个系列
- 14. 从两个具有相同列的表中选择数据
- 15. 在其中一个字段中查找具有相同值的SQL记录
- 16. 在所有等效的数据库中查找具有不同类型的列
- 17. 在高图中找到一个具有相同xpath的点
- 18. 在Rails的不同列中查找具有相同值的记录
- 19. 查找散列表中有多少个键具有相同的值?
- 20. 从同一个表中查找相似的数据
- 21. MySQL:查找“相同”数据
- 22. 在一个data.frame中查找值并从其他列转移值
- 23. 在一个特定列中折叠具有相同值的行
- 24. 在一个数组中具有相同值的多个键
- 25. SQL查找一列具有相同值并且其他列具有不同值的行
- 26. 来自两个具有相同列名的表的数据
- 27. 在同一阵列内移动具有相同值的数组
- 28. 检查2个数据表是否具有相同的模式
- 29. 检查两个QSharedPointer具有相同的数据
- 30. 查找具有相同值的系列mathlab
Upvote from me。感谢您提供比我更详尽的答案。 – Jubbles 2012-04-22 01:53:12
我喜欢在这里使用集群。这里有更多潜在答案的空间,因为这个答案没有解决即使值基本相同也会出现的浮点值差异问题。 – John 2012-04-22 02:32:49
从identical.mat中提取信息的另一种方法可能是...... which(identical.mat,arr.ind = TRUE)'(只有使用lower.tri()才会更好) – John 2012-04-22 02:35:49