簡體   English   中英

如何刪除R中的一個因子水平?

[英]how do I remove one factor level in R?

我需要從R中的數據框中刪除變量。我的數據包含18個因素的列:

  1. 農業
  2. 漁業...
  3. 未分類

在創建啞變量以說“人X在Y行業工作”之前,我需要刪除因子18。 也就是說,我只需要保留前17個級別(分類級別)

在Stata中刪除該級別將是

drop if rama1 == 99

(rama1是因子列,而99是“未分類”)

然后在Stata中創建虛擬變量(每個行業一個二進制變量),我運行:

quietly tabulate rama1, generate(rama1_)

R中的是:

for(i in unique(data$rama1)) {
data[paste("type", i, sep="")] <- ifelse(data$rama1 == i, 1, 0)
}

有任何想法嗎? 非常歡迎您的幫助

要刪除級別,BondedDust或jlhoward都可以使用。 要創建虛擬變量,將取決於您想要的/如何制定它。

例如,對於刪除的因子,是否要使行顯示為<NA>0


基數R

要做到這一點,最簡單的方法是使用model.matrix在基地R.所以建立由BondedDust的例子;

df <- data.frame(x=as.factor(sample(LETTERS[1:5],100, replace=TRUE)), y=1:100)

# remove E and the level
is.na(df$x) <- df$x == "E"
df$x <- factor(df$x)

產生此:

> head(df)
     x y
1    D 1
2    C 2
3    A 3
4 <NA> 4
5    D 5
6    A 6

然后,我們可以簡單地運行model.matrix來獲取因子水平的虛擬變量。 默認情況下,它將所有NA更改為0。

> model.matrix(~x, df)
    (Intercept) xB xC xD
1             1  0  0  1
2             1  0  1  0
3             1  0  0  0
5             1  0  0  1
6             1  0  0  0
8             1  1  0  0
9             1  0  0  0
11            1  0  0  0
12            1  0  1  0

插入符號

另一種方法是使用插入符號包,當在測試/保持模型中運行這些因素/重新設置時,它可能會給您帶來更多的功能。

它包含為您執行此操作的dummyVars函數。

> xx <- dummyVars(~x, df)
> predict(xx, df)
    x.A x.B x.C x.D
1     0   0   0   1
2     0   0   1   0
3     1   0   0   0
4    NA  NA  NA  NA
5     0   0   0   1
6     1   0   0   0
7    NA  NA  NA  NA

R還具有“刪除”級別(毫不droplevels稱為droplevels)的droplevels 從上下文來看,我猜測Stata的drop更像R的is.na<- ,因為它似乎是在將該列設置為丟失項。 為了防止R顯示現在的“缺失”電平,您需要首先刪除這些值,然后刪除這些電平。

完全不需要創建多個列,每個“虛擬”都需要一個。 我懷疑在Stata中也不需要它。 我認為這是一種可能會從SAS或SPSS進行的操作。 R中的回歸和表操作將通過單個列適當地完成。

df <- data.frame(x=as.factor(sample(LETTERS[1:5],100, replace=TRUE)), y=1:100)
levels(df$x)
#[1] "A" "B" "C" "D" "E"
is.na(df$x) <- df$x == "E"
lm( y~x, df)
#--------------
Call:
lm(formula = y ~ x, data = df)

Coefficients:
(Intercept)           xB           xC           xD  
    49.3846      -0.7846       2.9838       2.7692  

如果df1$rami是通過對99進行測試所建議的數字,那么無論如何它都不是一個因素,並且對級別的討論也沒有密切關系。

擴大我的評論:

set.seed(1)
df <- data.frame(x=as.factor(sample(LETTERS[1:5],10, replace=TRUE)), y=1:10)
levels(df$x)
# [1] "A" "B" "C" "D" "E"
df <- df[df$x!="E",]        # remove all rows with df$x=="E"
levels(df$x)                # level E remains
# [1] "A" "B" "C" "D" "E"
df$x <- factor(df$x)        # get rid of it...
levels(df$x)
# [1] "A" "B" "C" "D"

請注意, as.factor(...)無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM