2017-01-08 13 views
7

setattr kullanarak bir sütunun faktör düzeylerini değiştirmek istiyorum. Ancak, sütun standart data.table yolu (dt[ , col]) seçildiğinde, levels güncelleştirilmez. Öte yandan, data.table ayarında, yani $'un kullanıldığı alışılmamış bir şekilde sütunu seçerken - çalışır.Setattr ile bir sütundaki faktör düzeylerini değiştirmek, sütunun nasıl oluşturulduğu konusunda hassastır.

library(data.table) 

# Some data 
d <- data.table(x = factor(c("b", "a", "a", "b")), y = 1:4) 
d 
# x y 
# 1: b 1 
# 2: a 2 
# 3: a 3 
# 4: b 4 

# We want to change levels of 'x' using setattr 
# New desired levels 
lev <- c("a_new", "b_new") 

# Select column in the standard data.table way 
setattr(x = d[ , x], name = "levels", value = lev) 

# Levels are not updated 
d 
# x y 
# 1: b 1 
# 2: a 2 
# 3: a 3 
# 4: b 4 

# Select column in a non-standard data.table way using $ 
setattr(x = d$x, name = "levels", value = lev) 

# Levels are updated 
d 
#  x y 
# 1: b_new 1 
# 2: a_new 2 
# 3: a_new 3 
# 4: b_new 4 

# Just check if d[ , x] really is the same as d$x 
d <- data.table(x = factor(c("b", "a", "a", "b")), y = 1:4) 
identical(d[ , x], d$x) 
# [1] TRUE 
# Yes, it seems so 

bazı data.table kaçırıyorum gibi geliyor (R?) Buraya temelleri. Neler olduğunu açıklayan var mı?


Ben setattr ve levels diğer iki yazı bulduk:

bunlardan

setattr on levels preserving unwanted duplicates (R data.table)

How does one change the levels of a factor column in a data.table

Hem sütun seçmek için $ kullandı. Hiçbiri [ , col] yolundan bahsetmedi.

İkinizin de ifadelerden adrese bakarsak anlamaya yardımcı olabilecek
+0

Dokümanlara göre bir sorun olmamalı - * ‘setattr’ herhangi bir girişi kabul eder; Örneğin, liste, bir "data.frame" veya ‘data.table’ sütunları. * Sizinle aynı sorunu yaşıyorum. – thelatemail

+1

Bu davranış bana mantıklı geliyor. Fwiw, herzaman j'nin içinde setattr yapıyorum, ki burada iyi çalışıyor gibi görünüyor: 'd [, setattr (x," levels ", lev)]' – Frank

+1

@Frank Geri bildiriminiz için teşekkür ederiz. Dün çok yorgundum, bu yüzden sadece uykuya dalmadan önce yukarı-oka basmayı başardım. Yarı travmatik “j” deneyiminden sonra tatlı rüyalar mı (ya da kabuslar mıydı?). En azından ben de haklıymışım gibi "data.table" ("R'?") Temellerini burada eksik hissediyorum gibi hissediyorum ";) – Henrik

cevap

8

: Birden kere çağırdığınızda ikinci ifadesi yok iken ilk ifadeden adresi değişmediği

address(d$x) 
# [1] "0x10e4ac4d8" 
address(d$x) 
# [1] "0x10e4ac4d8" 


address(d[,x]) 
# [1] "0x105e0b520" 
address(d[,x]) 
# [1] "0x105e0a600" 

Not Bu, adresin dinamik yapısı nedeniyle sütunun bir kopyasını oluşturduğunu gösterir, bu nedenle üzerinde setattr orijinal data.table üzerinde hiçbir etkisi olmaz.

+0

@Henrik - benim saf bakış açımdan, dokümanlar ile çelişiyor gibi görünüyor. En azından, not edilmelidir. – thelatemail

+0

Genelde 'j' konumunda yaptığınız, yani özetleyen, yeni sütunlar ve yeni listeler yaratmadığınız sürece makul olduğunu düşünüyorum:' '=. Ama sadece bir tahmin. – Psidom

+0

@Psidom Evet, bu mantıklı. Teşekkürler. Benim cehaletimde, '' sadece '' basitçe bir sütun seçimi yapabildiğimi sandım. Aslında, bazı 'data.table' temellerinden yoksundur. – Henrik

İlgili konular