2016-08-18 94 views
-1

我有一個簡單的任務,但我無法解決我的問題。R中新列中的綜合因子

我有一個巨大的數據幀,並希望執行KNN,但不能這樣做,因爲我得到以下錯誤:

Error: factor predictors must have at most 32 levels

到目前爲止好。我的想法是聚集列,因此我得到更少的因素。

str(only_savings_medium$MaterialGroupCode) 

Factor w/ 40 levels "1A","1B","1C",..: 11 11 11 15 15 15 15 15 15 15 ... 

有40個級別 「代碼」 的在 「1A」 的形式, 「1B」,..., 「2B」, 「2D」,..., 「3A」,...「 3D「,」4B「,」4C「,...,」5A「,...,」5Z「。基本上我想檢查因素是否包含一個1,2,3,4或5並將其分配給新列。帶有1(任何字母)的所有代碼將被分配爲1,2(任意字母)至2,依此類推。最後,應該有一個只有5個因素的新專欄,每個專欄包含所有較小的因素。我不確定如何解釋,並希望您瞭解我的問題。

編輯:我會盡量擴大我的解釋。這裏是S數據幀的一部分:

Dataframe

正如你所看到的,有不同的材料組碼一欄。有40個級別。我需要:爲此數據框創建新列。此列包含5個級別(1,2,3,4或5)。如果我們以我的屏幕截圖爲例 - 我們將有一個新的庫侖,其級別如下:2,2,2,2,2,1,1,1,1,1,1,3,3,3,3,3 ...,3。基本上每1A - 1Z,被分配到新列的級別1,每2A - 2Z被分配到2,依此類推。

+0

不是。錯誤是您有一個或多個因子(列)的許多級別。你應該減少關卡的數量。以'cut'爲例。 – agstudy

+0

我們可以刪除字母,並更新因子水平。 – zx8754

+0

@agstudy是的,這就是我想要做的。減少級別的數量,從40到5. – Pixelements

回答

0

像這樣?

MGC <- as.factor(c("1A", "2Y", "1e", "5e")) 

firstplace <- function(x) strsplit(as.character(x), "")[[1]][1] 
sapply(MGC, firstplace) 

這將提取矢量(也許是data.frame中的一列)的第一個位置(在你的情況下:一個數字)。現在,退貨是字符類型。看,如果你需要as.factor()他們。

+0

我不明白如何將這個應用到我的問題...基本上我會做5向量MGC1 < - as.factor(c(「1A」,「1B」, 「1C」,「1D」,「1E」,)),MGC2,... MGC5,analog ...然後呢?仍然必須創建一個新列,並檢查哪一行屬於MGC1,哪些屬於MGC5 .. – Pixelements

0

基本上你想減少層數。這裏是一些指導原則(因爲你不提供重複的例子)

  1. 創建一個對應data.frame映射介乎40倍的水平與層次少一個新的因素第一個因素。
  2. 使用merge,將您的數據與這個corespondance data.frame合併。

下面的例子:

## the long factor , in your case 40 levels 
origin_factors <- c(LETTERS[1:5],LETTERS[6:10],LETTERS[11:15]) 
## the target one 
dest_factors <- c("l1","l2","l3") 
## the correspondence matrix 
corrs <- data.frame(
    x=c(LETTERS[1:5],LETTERS[6:10],LETTERS[11:15]), 
    nx=c(rep("l1",5),rep("l2",5),rep("l3",5)) 
) 
## create a reproducible example 
ex <- sample(sample(origin_factors),100,replace=T) 
dat <- data.frame(x=ex) 
## merge to reduce the number of levels. 
merge(dat,corrs) 
0

好吧,我終於能夠解決我的問題。既然我是一個初學者,你爲我提供了對我來說太複雜的代碼..這裏是我做了什麼:

我已經複製了整個「MaterialGroupCode」列並將它綁定到具有不同名稱的同一個DF。所以基本上我有相同的DF +「MaterialGroupCode」列的副本,名稱爲「MDC」。

my_df$MDC <- substring(my_df$MDC,1 ,1) 

所以我做了一個子字符串,因爲我只需要刪除字母。最後,這是一個性格,所以我不得不做的唯一的事情是:

my_df$MDC <- as.factor(my_df$MDC) 

現在我有一個新的列中密度纖維板,這與5級的一個因素,相當於1A ... 1Z爲1 ,2B ... 2Z爲2等等。