2011-10-19 12 views
6

[Güncelleştirme 1: Matthew Dowle'ın belirttiği gibi, CRAN değil R-Forge üzerinde data.table sürüm 1.6.7 kullanıyorum. data.table'un önceki bir sürümünde aynı davranışı göremezsiniz.R'nin veri çerçevelerinden veri tablolarına bağlantı kümesi işlemleri: Yinelenen satırlar nasıl belirlenir?

Arka plan olarak: Veri çerçevelerinin veya veri karesi çiftlerinin sıraları üzerinde işlem yapmak için bazı küçük yardımcı işlevler yüklüyorum (örneğin, her satır bir kümedeki bir eleman), örneğin benzersiz - bir listeden, birleşimden, kesişimden, set farkından vb. bir set oluşturmak için R (R'nin ayarlanmış operasyonları vektörler ve listelerle sınırlı olan) Matlab'ın intersect(...,'rows'), setdiff(...,'rows'), vb. ancak matrisler veya veri kareleri satırları değil). Bu küçük fonksiyonların örnekleri aşağıdadır. Bazı paketlerde veya R tabanında veri çerçeveleri için bu işlev zaten mevcutsa, önerilere açığım.

Bunları veri tablolarına taşıyorum ve mevcut yaklaşımdaki gerekli adımlardan biri yinelenen satırları bulmak. duplicated() yürütüldüğünde, veri tablolarının anahtar içermesi gerektiğini belirten bir hata döndürülür. Bu, talihsiz bir barikattır - bu, evrensel bir çözüm olmayan ve hesaplama maliyetlerine ekleyen anahtarları belirlemekten başka, yinelenen nesneleri bulmanın başka bir yolu var mıdır?

library(data.table) 
set.seed(0) 
x <- as.data.table(matrix(sample(2, 100, replace = TRUE), ncol = 4)) 
y <- as.data.table(matrix(sample(2, 100, replace = TRUE), ncol = 4)) 

res3 <- dt_intersect(x,y) 

bu hata mesajını Verim:: veri çerçevelerinin olduğu gibi ben desen dt_operation her fonksiyon adında ettik olsa

Error in duplicated.data.table(z_rbind) : data table must have keys 

kod çalışır İşte

bir tekrarlanabilir örnektir .

Bu sorunun üstesinden gelmenin bir yolu var mı? Ayar anahtarları sadece tamsayılar için çalışır, bu da giriş verileri için üstlenemediğim bir kısıtlamadır. Yani, belki veri tablolarını kullanmak için akıllıca bir yol eksik?

dt_unique  <- function(x){ 
    return(unique(x)) 
} 

dt_union  <- function(x,y){ 
    z_rbind  <- rbind(x,y) 
    z_unique <- dt_unique(z_rbind) 
    return(z_unique) 
} 

dt_intersect <- function(x,y){ 
    zx   <- dt_unique(x) 
    zy   <- dt_unique(y) 

    z_rbind  <- rbind(zy,zx) 
    ixDupe  <- which(duplicated(z_rbind)) 
    z   <- z_rbind[ixDupe,] 
    return(z) 
} 

dt_setdiff  <- function(x,y){ 
    zx   <- dt_unique(x) 
    zy   <- dt_unique(y) 

    z_rbind  <- rbind(zy,zx) 
    ixRangeX <- (nrow(zy) + 1):nrow(z_rbind) 
    ixNotDupe <- which(!duplicated(z_rbind)) 
    ixDiff  <- intersect(ixNotDupe, ixRangeX) 
    diffX  <- z_rbind[ixDiff,] 
    return(diffX) 
} 

Not 1: setleri elemanları veri sıraları


Örnek ayarlanmış olan çalışma fonksiyonları, bu ilave yardımcı fonksiyonlar için bir kullanım amacı anahtar değerlerinin satırları bulmak yer olan x, y'deki anahtar değerler arasında değildir. Bu şekilde, x[y] veya y[x] hesaplanırken NA'ların nerede görünebileceğini bulabilirim. Bu kullanım, z_rbind nesnesinin anahtarlarının ayarlanmasına izin verse de, yalnızca bu kullanım durumu için kendimi kısıtlamamayı tercih ederim.

Not 2: İlgili yayınları için; here is a post updated data.table paketi ile bunu çalıştırmak için mükemmel sonuçlar ile veri çerçeveleri üzerinde unique, çalıştıran. Ve this is an earlier post, veri tablolarında unique çalıştırıyor.

cevap

6

duplicated.data.table, aynı düzeltmeye ihtiyacı unique.data.table var [DÜZENLEME: Şimdi v1.7.2'de bitti]. Lütfen başka bir hata raporunu yükseltin: bug.report(package="data.table"). Başkalarının izlemesi için, zaten CRAN'da 1.6.6 değil, R-Forge'dan v1.6.7 kullanıyorsunuz.

x[-x[y,which=TRUE]] 

FR#1384 (? 'Değil' ve 'whichna' argümanlar Yeni) kullanıcıları için bu kolaylaştırmak için Ayrıca bkz ve bağlantılar bu: Not 1

Fakat, bir 'katılamaz' deyim var Daha fazla ayrıntıya giden keys that don't match iş parçacığına.


Güncelleme. Şimdi v1.8.3'te, katılmama gerçekleştirildi.

DT[-DT["a",which=TRUE,nomatch=0],...] # old idiom 
DT[!"a",...]       # same result, now preferred. 
+0

Teşekkürler! İyi nokta - ben data.table 'güncelledim bahsetmeyi unuttum. Ayrıca, 'bug.report()' benim için yeni. – Iterator

+0

Matthew, kodunuz x olmalıdır [x [-x [y, = = TRUE, nomatch = 0]] '? Nomatch = 0' argümanı olmaksızın şu hatayı alıyorum: '[.default (x [[s]] 'daki hata): sadece 0’lar negatif subscripts' ile karıştırılabilir. – Ryogi

+0

@RYogi. Emin değil. Bir örnek lazım, belki de yeni bir soru. –

İlgili konular