2016-08-18 70 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等等。