我有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. 查找在另一列中具有相同值的行 - Python
- 3. 在熊貓數據框中查找具有相同列值的行
- 4. 查詢中的列不具有在另一列的值相同
- 5. 在MySQL列中查找具有相同值的行
- 6. 在多列中查找具有相同值的行
- 7. 如何查找在Solr中具有相同值的兩列
- 8. 強制多個表在數據庫中具有相同的列
- 9. SQL查找相同的列數據
- 10. 是否可行的寫查詢來查找具有兩個不同列,具有相同的數據以不同的順序的表中的數據
- 11. NHibernate查詢查找具有一些相同的列和一個表中的一些不同的記錄
- 12. drupal數據庫數據與多個表具有相同的列
- 13. 查找具有兩個相似列和一個不同的重複項
- 14. [R data.frame列具有相同的名稱check.names = FALSE不工作
- 15. 具有相同的數據
- 16. 在單獨的陣列中查找具有相同值的兩個字段
- 17. 如何查找具有相同兩列的行,但一列不同?
- 18. 查找具有相同第一個字符的單詞
- 19. 比較兩個data.frames找到data.frame 1具有在選定的列
- 20. 從兩個具有相同列的表中選擇數據
- 21. HighChart中具有相同xAxis數據的幾個系列
- 22. 從多個表中選擇具有相同列名的數據
- 23. 查詢SQL表中同一列具有相同的ID
- 24. 在其中一個字段中查找具有相同值的SQL記錄
- 25. SQL查詢以查找具有相同列值的多行
- 26. 具有相同列的相同表的數據建模
- 27. 在所有等效的數據庫中查找具有不同類型的列
- 28. 在高圖中找到一個具有相同xpath的點
- 29. 查找具有相同值的行在不同列中的行對
- 30. 在Rails的不同列中查找具有相同值的記錄
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