Bazı sayısal sütunları olan bir veri çerçevesi var. Bazı satırlar istatistiksel analizde null olarak kabul edilmesi gereken 0 değerine sahiptir. 0'daki tüm 0 değerlerini R yerine NULL olarak değiştirmenin en hızlı yolu nedir?
Bazı sayısal sütunları olan bir veri çerçevesi var. Bazı satırlar istatistiksel analizde null olarak kabul edilmesi gereken 0 değerine sahiptir. 0'daki tüm 0 değerlerini R yerine NULL olarak değiştirmenin en hızlı yolu nedir?
Yanıtlar:
Tüm sıfırları NA olarak değiştirmek:
df[df == 0] <- NA
açıklama
1.NULL
Sıfırları değiştirmek istediğiniz şey değildir . Dediği gibi ?'NULL'
,
NULL, R'deki null nesneyi temsil eder
Bu benzersiz ve sanırım, en bilgisiz ve boş nesne olarak görülebilir. 1 O zaman o kadar şaşırtıcı değil ki
data.frame(x = c(1, NULL, 2))
# x
# 1 1
# 2 2
Yani, R bu boş nesne için yer ayırmaz. 2 Bu arada, şunu ?'NA'
görüyoruz ki
NA, eksik bir değer göstergesi içeren uzunluk 1'in mantıksal sabitidir. NA ham hariç herhangi bir vektör türüne zorlanabilir.
Önemli olarak, NA
R uzunluğu için yer ayırması için uzunluk 1'dir. Örneğin,
data.frame(x = c(1, NA, 2))
# x
# 1 1
# 2 NA
# 3 2
Ayrıca, veri çerçevesi yapısı tüm sütunların aynı sayıda öğeye sahip olmasını gerektirir, böylece "delik" (yani NULL
değerler) olamaz .
Artık sıfırları, NULL
en az bir sıfır içeren tüm satırları tamamen kaldırmak anlamında bir veri çerçevesinde değiştirebilirsiniz . Kullanırken, örneğin var
, cov
ya da cor
, bu ilk ile sıfır yerine aslında eşdeğerdir NA
ve değerini ayarlayarak use
olarak "complete.obs"
. Bununla birlikte, tipik olarak, bu ekstra bilgi kaybına yol açtığı için tatmin edici değildir.
2. Bir çeşit döngü çalıştırmak yerine, çözümde df == 0
vektörleştirmeyi kullanıyorum. df == 0
döner (denemek) ile aynı boyutta bir matris df
girdileri ile TRUE
ve FALSE
. Ayrıca, bu matrisi alt kümeye geçirmemize izin verilir [...]
(bkz. ?'['
). Son olarak, sonucu df[df == 0]
tamamen sezgisel olsa da df[df == 0] <- NA
, istenen etkiyi veren garip görünebilir . Atama operatörü <-
aslında her zaman çok akıllı değildir ve diğer bazı nesnelerle bu şekilde çalışmaz, ancak veri çerçevelerinde bunu yapar; bakın ?'<-'
.
1 Küme teorisindeki boş küme bir şekilde ilişkilidir.
2 Küme teorisine bir başka benzerlik: boş küme her kümenin bir alt kümesidir, ancak bunun için yer ayırmayız.
Data.frame'inizin farklı veri türlerinin bir karışımı olduğunu varsayalım ve tüm sütunların değiştirilmesi gerekmez.
yalnızca 12 ile 18 arasındaki sütunları (toplam 21'in) değiştirmek için bunu yapmanız yeterlidir
df[, 12:18][df[, 12:18] == 0] <- NA
[<-
İşlevsiz alternatif bir yol :
Örnek bir veri çerçevesi dat
(@ Chase'in cevabından utanmadan kopyalandı):
dat
x y
1 0 2
2 1 2
3 1 1
4 2 1
5 0 0
Sıfır ile değiştirilebilir NA
tarafından is.na<-
fonksiyonu:
is.na(dat) <- !dat
dat
x y
1 NA 2
2 1 2
3 1 1
4 2 1
5 NA NA
Birisi bunun Data.Table sürümünü istedi ve verilen data.frame çözümü data.table ile çalışmadığından, aşağıdaki çözümü sağlıyorum.
Temel olarak, :=
operatörü kullanın ->DT[x == 0, x := NA]
library("data.table")
status = as.data.table(occupationalStatus)
head(status, 10)
origin destination N
1: 1 1 50
2: 2 1 16
3: 3 1 12
4: 4 1 11
5: 5 1 2
6: 6 1 12
7: 7 1 0
8: 8 1 0
9: 1 2 19
10: 2 2 40
status[N == 0, N := NA]
head(status, 10)
origin destination N
1: 1 1 50
2: 2 1 16
3: 3 1 12
4: 4 1 11
5: 5 1 2
6: 6 1 12
7: 7 1 NA
8: 8 1 NA
9: 1 2 19
10: 2 2 40
Sen yerini alabilir 0
ile NA
yalnızca sayısal alanlarda (yani faktörlere gibi şeyler hariç), ama bir sütun bazında sütunda bazında çalışır:
col[col == 0 & is.numeric(col)] <- NA
Bir işlevle, bunu tüm veri çerçevenize uygulayabilirsiniz:
changetoNA <- function(colnum,df) {
col <- df[,colnum]
if (is.numeric(col)) { #edit: verifying column is numeric
col[col == -1 & is.numeric(col)] <- NA
}
return(col)
}
df <- data.frame(sapply(1:5, changetoNA, df))
Bununla 1:5
birlikte, veri çerçevenizdeki sütun sayısıyla veya ile değiştirebilirsiniz 1:ncol(df)
.
1:5
ile 1:ncol(df)
sonunda. Denklemi aşırı derecede karmaşık veya okumayı zorlaştırmak istemedim.
1:5
sizin gibi değişti istediğiniz sütun numaralarına 12:15
, ama bunu yalnızca sayısal sütunlar etkileyeceğini onaylayın istiyorsa o zaman sadece bu gibi bir if açıklamada fonksiyonunun ikinci satırını sarın: if (is.numeric(col)) { col[col == -1 & is.numeric(col)] <- NA }
.