从1个字符串列

时间:2016-06-14 13:03:44

标签: r loops dataframe comparison

我是初学者。我有一个从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
}

如何才能做到这一点?

感谢。

1 个答案:

答案 0 :(得分:0)

你当然可以使用for循环来解决问题,但是我可以建议一个更长效的解决方案:reshape2 package(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仅在数据中出现一次,因此length函数中用于聚合数据的dcast函数在每列中只放置0和1。

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

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

方括号内的否定下标会删除数据集中的列,因此您可以同时删除id列。

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

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

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