从 1 个字符串列创建新的数字列

Create new numeric columns from 1 string column

我是初学者。我有一个取自 here 的数据集,其中包含具有不同属性的人物资料,而 profession 就是其中的一个。有12种职业:行政、蓝领、企业家、女佣、管理、退休、个体户、服务、学生、技术员、失业、未知。

我想对那个数据集应用K-NN,所以我想将专业列分配到12个新列中,并将1属性分配给相应的专业,0 不属于那个人的所有其他11个职业。

我尝试了 foreach packagefor loops,但没有成功。我无法使用 foreach,而且我不知道下一步该怎么做,来自以下代码:

jobs <- data[,2]
jobs
for (job in jobs) {
    print(job)
    #No idea how to create the new columns here, based on if conditionals
}

最好的方法是什么?

谢谢。


您当然可以使用 for 循环解决问题,但我可以建议一个在长 运行 中更有效的解决方案:reshape2 包 (https://cran.r-project.org/web/packages/reshape2/).

我已将 bank-full.csv 中的数据读入对象库中的 R。接下来需要下载、安装和加载reshape2包:

install.packages("reshape2")
library(reshape2)

然后可以将数据整形为一种格式,其中观察在行上,作业在列上。附件 id 列首先添加到数据中:

bank$id<-1:nrow(bank)

然后,从数据框 bank 中取出第 2 列和第 18 列(工作和 id)并将它们转换为上述形式,如下所示:

tmp<-dcast(bank[,c(2, 18)], id~job, length)

这应该会提供一个新的数据框 tmp,其中每个作业都有自己的列。由于每个 id 在数据中只出现一次,因此 dcast 函数中用于聚合数据的 length 函数在每一列中只放置 0 和 1。

最后,可以将这些新列添加到原始数据集中:

bank<-cbind(bank[,-18], tmp[,-1])

方括号内的负下标从数据集中删除列,因此这同时让您摆脱了 id 列。


另一种更有效的方法是使用函数 model.matrix:

bank2<-cbind(bank, model.matrix( ~ 0 + job, bank))

这应该会为您提供一个数据框,其中每个作业都作为一个新列。但是请注意,它稍微更改了列名(将作业添加到作业列的开头)。