[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.
Teşekkürler! İyi nokta - ben data.table 'güncelledim bahsetmeyi unuttum. Ayrıca, 'bug.report()' benim için yeni. – Iterator
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
@RYogi. Emin değil. Bir örnek lazım, belki de yeni bir soru. –