繁体   English   中英

在R中将分类列转换为多个二进制列

[英]Converting Categorical Columns into Multiple Binary Columns in R

我正在尝试将具有分类数据(“ A”,“ B”或“ C”)的列转换为3列,其中1,0,0将是“ A”; 0,1,0代表'B',依此类推。

我在网上找到此代码:

flags = data.frame(Reduce(cbind, 
     lapply(levels(d$purpose), function(x){(d$purpose == x)*1})
))
names(flags) = levels(d$purpose)
d = cbind(d, flags)

# Include the new columns as input variables
levelnames = paste(names(flags), collapse = " + ")
neuralnet(paste("output ~ ", levelnames), d)

在R中将分类变量转换为ANN(神经网络)

但是我对R很陌生。任何人都可以分解一下看起来很复杂的代码在做什么吗?

编辑:

实施@nongkrong的建议时,我遇到了一个问题:

CSV:

X1,X2,X3
A,D,Q
B,E,R
C,F,S
B,G,T
C,H,U
A,D,Q

R:

newData <- read.csv("new.csv")
newerData <- model.matrix(~ X1 + X2 + X3 -1, data=newData)
newerData

R输出:

  X1A X1B X1C X2E X2F X2G X2H X3R X3S X3T X3U
1   1   0   0   0   0   0   0   0   0   0   0
2   0   1   0   1   0   0   0   1   0   0   0
3   0   0   1   0   1   0   0   0   1   0   0
4   0   1   0   0   0   1   0   0   0   1   0
5   0   0   1   0   0   0   1   0   0   0   1
6   1   0   0   0   0   0   0   0   0   0   0

它适合1列,但缺少X2D和X3Q。 有什么想法吗?

@nongkrong是正确的-阅读?formulas ,您将看到大多数接受formula s作为输入的函数(例如lmglm等)将自动将分类变量(存储为factor s或character )转换为虚拟变量。 你可以强制使用在非factor通过指定数值变量as.factor(var)的配方食品中。

就是说,我遇到了手动创建这些指标还是很方便的情况,例如,带有种族变量的数据集,其中小于1%的数据适合一个或多个种族代码。 还有其他方法可以解决此问题(例如,只需删除少数族裔意见),但我发现情况会有所不同。

因此,我为您注释了代码:

flags = data.frame(Reduce(cbind, 
     lapply(levels(d$purpose), function(x){(d$purpose == x)*1})
))

第一行有很多事情要做,所以让我们一点一点地走:

d$purpose==x检查每个的条目d$purpose平等于x ; 结果将为TRUEFALSE (如果缺少值,则为NA )。 乘以1*1 )将输出强制为整数(因此TRUE变为1FALSE变为0 )。

lapply在其第二个参数将该函数应用于第一个参数的每个元素-因此对于中的每个元素levels(d$purpose) (即,每一级d$purpose ),我们输出的矢量0秒和1 S,其中1 s对应于匹配给定级别的d$purpose的元素。 lapply的输出是一个list (因此位于apply前面的l ),其中一个list元素对应于d$purpose每个级别。

我们希望将其放入data.frame ,因此list不是很有用; Reduce是我们用来将list的信息回data.frame表单的工具。 Reduce(cbind,LIST)cbind(LIST[[1]],LIST[[2]],LIST[[3]],...)相同-方便的速记,尤其是当我们不知道LIST长度。

将其包装在data.frame会将其强制转换为data.frame模式。

#This line simply puts column names on each of the indicator variables
#  Note that you can replace the RHS of this line with whatever 
#  naming convention you want for the levels--a common approach might
#  be to specify paste0(levels(d$purpose),"_flag"), e.g.
names(flags) = levels(d$purpose)
#this line adds all the indicator variables to the original 
#  data.frame
d = cbind(d, flags)
#this creates a string of the form "level1 + level2 + ... + leveln"
levelnames = paste(names(flags), collapse = " + ")
#finally we create a formula of the form y~x+d1+d2+d3
#  where each of the d* is a dummy for a level of the categorical variable
neuralnet(paste("output ~ ", levelnames), d)

还要注意,在data.table包中可以这样简单地完成一些操作:

library(data.table)
setDT(d)
l = levels(purpose)
d[ , (l) := lapply(l, function(x) as.integer(purpose == x))]
d[ , neuralnet(paste0("output~", paste0(l, collapse = "+"))]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM