![](/img/trans.png)
[英]R: Converting multiple binary columns into one factor variable whose factors are binary columns
[英]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很陌生。任何人都可以分解一下看起来很复杂的代码在做什么吗?
编辑:
实施@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作为输入的函数(例如lm
, glm
等)将自动将分类变量(存储为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
; 结果将为TRUE
或FALSE
(如果缺少值,则为NA
)。 乘以1
( *1
)将输出强制为整数(因此TRUE
变为1
而FALSE
变为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.