2016-05-22 12 views
6

Jak mogę wyodrębnić nazwy kolumn (lub indeks wiersza i kolumny) z duplikatu elementu w następnej ramce danych?Indeks nieunikalnego elementu w ramce danych

  V1   V2   V3   V4 
PC1 0.5863431 0.5863431 3.952237e-01 3.952237e-01 
PC2 -0.3952237 -0.3952237 5.863431e-01 5.863431e-01 
PC3 -0.7071068 0.7071068 1.665335e-16 3.885781e-16 

Przykładowo 0.5863431 wynosi 0.5863431 tak "V1" i "V2" to nazwy kolumny.

W tym dataframe chcę uzyskać:

[1] "V1" "V2" "V3" "V4" 

Jak widać, patrząc raczej tylko wynik pierwszego rzędu.

Drugi przykład:

  V1   V2   V3   V4 
PC1 -0.5987139 -0.5987139 -0.03790446 0.5307039 
PC2 -0.0189601 -0.0189601 -0.99315168 -0.1137136 
PC3 0.3986891 0.3523926 -0.11045319 0.8394442 

Wynik:

[1] "V1" "V2" 

Odpowiedz

3

Nieco inne podejście używając which i apply

# convert to matrix 
mat1 <- as.matrix(df1) 
# find duplicates and store them 
dups <- mat1[which(duplicated(c(mat1)))] 
# identify columns containing a value in dups 
names(which(apply(mat1, 2, function(x) any(x %in% dups)))) 
#[1] "V1" "V2" "V3" "V4" 

mat2 <- as.matrix(df2) 
dups <- mat2[which(duplicated(c(mat2)))] 
names(which(apply(mat2, 2, function(x) any(x %in% dups)))) 
#[1] "V1" "V2" 
8

Nie może być lepszy sposób, ale tutaj jest moje zdanie na jej temat.

## coerce to matrix (if not already) 
m <- as.matrix(df) 
## find duplicates across both margins 
d <- duplicated(m, MARGIN = 0) | duplicated(m, MARGIN = 0, fromLast = TRUE) 
## grab the unique col names 
colnames(m)[unique(col(d)[d])] 

Przykłady: na swojej pierwszej ramki danych -

df1 <- read.table(text = "V1   V2   V3   V4 
PC1 0.5863431 0.5863431 3.952237e-01 3.952237e-01 
PC2 -0.3952237 -0.3952237 5.863431e-01 5.863431e-01 
PC3 -0.7071068 0.7071068 1.665335e-16 3.885781e-16", header = TRUE) 

m1 <- as.matrix(df1) 
d1 <- duplicated(m1, MARGIN = 0) | duplicated(m1, MARGIN = 0, fromLast = TRUE) 
colnames(m1)[unique(col(d1)[d1])] 
# [1] "V1" "V2" "V3" "V4" 

a drugiego -

df2 <- read.table(text = "V1   V2   V3   V4 
PC1 -0.5987139 -0.5987139 -0.03790446 0.5307039 
PC2 -0.0189601 -0.0189601 -0.99315168 -0.1137136 
PC3 0.3986891 0.3523926 -0.11045319 0.8394442", header = TRUE) 

m2 <- as.matrix(df2) 
d2 <- duplicated(m2, MARGIN = 0) | duplicated(m2, MARGIN = 0, fromLast = TRUE) 
colnames(m2)[unique(col(d2)[d2])] 
# [1] "V1" "V2" 

marginesie: Ponieważ dane zawierają wszystkie wartości liczbowe bym zalecamy rozpoczynać od macierzy zamiast ramki danych.

1

Z cokolwiek podejście użyć, należy pamiętać o FAQ 7,31 przy pracy z liczb zmiennoprzecinkowych. Możesz utworzyć nową macierz, w której masz "zaokrąglone" do tej samej liczby cyfr; chociaż mogą wyglądać tak samo na wydruku, mogą wystąpić różnice, których nie widać na końcowych cyfrach.