2017-07-25 62 views
3

我有一個數據框(df)或數據表(dt),假設有1000個變量和1000個觀察值。我檢查了觀察中沒有重複,所以dt[!duplicated(dt)]與原始文件具有相同的長度。創建一個唯一的ID變量作爲變量的組合

我想創建一個ID變量爲所有這些觀察與我有一千個變量的組合。 與其他SO問題不同,因爲我不知道哪些變量更適合創建ID,並且可能需要至少3個或4個變量的組合。

R中是否有任何包/功能可以使我獲得最有效的變量組合來創建ID變量?在我的真實例子中,我正在努力手動創建一個ID,並且它可能不是變量的最佳組合。

例與mtcars:

require(data.table) 
example <- data.table(mtcars) 
rownames(example) <- NULL # Delete mtcars row names 
example <- example[!duplicated(example),] 
example[,id_var_wrong := paste0(mpg,"_",cyl)] 
length(unique(example$id_var_wrong)) # Wrong ID, there are only 27 different values for this variable despite 32 observations 

example[,id_var_good := paste0(wt,"_",qsec)] 
length(unique(example$id_var_good)) # Good ID as there are equal number of unique values as different observations. 

是否有任何功能,自動和手動沒有找到wtqsec

+0

可能的重複[分配基於兩列的唯一ID](https://stackoverflow.com/questions/42921674/assign-unique-id-based-on-two-columns) – Florian

+0

你正在做這個浮點值。所以,有問題 – akrun

+1

ID必須是人類可讀的嗎?如果沒有,你可以嘗試[uuid](https://cran.r-project.org/web/packages/uuid/index.html)包。 –

回答

1

一種自制的算法:其原理是貪婪地接受具有最多不同數量元素的變量,然後僅過濾剩餘的具有重複項的行並進行迭代。這並不能提供最好的解決方案,但它是快速獲得相當好的解決方案的簡單方法。

set.seed(1) 
mat <- replicate(1000, sample(c(letters, LETTERS), size = 100, replace = TRUE)) 

library(dplyr) 

columnsID <- function(mat) { 
    df <- df0 <- as_data_frame(mat) 
    vars <- c() 
    while(nrow(df) > 0) { 
    var_best <- names(which.max(lapply(df, n_distinct)))[[1]] 
    vars <- append(vars, var_best) 
    df <- group_by_at(df0, vars) %>% filter(n() > 1) 
    } 
    vars 
} 

columnsID(mat) 
[1] "V68" "V32" 
1

在許多情況下,有一個自然的關鍵是唯一標識每個觀察。例如,mtcars數據集具有唯一的行名稱。

library(data.table) 
data.table(mtcars, keep.rownames = "id") 
     id mpg cyl disp hp drat wt qsec vs am gear carb 
1:   Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 
2:  Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 
3:   Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 
4:  Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 
5: Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 
6:    Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 
... 

如果沒有自然鍵可用,我建議通過簡單地連續編號的行並將其存儲在一個附加列創建articifial鍵:

data.table(mtcars)[, rn := .I][] 
 mpg cyl disp hp drat wt qsec vs am gear carb rn 
1: 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 1 
2: 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 2 
3: 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 3 
4: 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 4 
5: 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 5 
6: 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 6 
... 

其他任何可能都不值得付出努力,或者存在屬性值可能變得完全相同的風險,例如,當它們四捨五入時。