从 1 个字符串列创建新的数字列
Create new numeric columns from 1 string column
我是初学者。我有一个取自 here 的数据集,其中包含具有不同属性的人物资料,而 profession
就是其中的一个。有12种职业:行政、蓝领、企业家、女佣、管理、退休、个体户、服务、学生、技术员、失业、未知。
我想对那个数据集应用K-NN,所以我想将专业列分配到12个新列中,并将1
属性分配给相应的专业,0
不属于那个人的所有其他11个职业。
我尝试了 foreach package
和 for 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))
这应该会为您提供一个数据框,其中每个作业都作为一个新列。但是请注意,它稍微更改了列名(将作业添加到作业列的开头)。
我是初学者。我有一个取自 here 的数据集,其中包含具有不同属性的人物资料,而 profession
就是其中的一个。有12种职业:行政、蓝领、企业家、女佣、管理、退休、个体户、服务、学生、技术员、失业、未知。
我想对那个数据集应用K-NN,所以我想将专业列分配到12个新列中,并将1
属性分配给相应的专业,0
不属于那个人的所有其他11个职业。
我尝试了 foreach package
和 for 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))
这应该会为您提供一个数据框,其中每个作业都作为一个新列。但是请注意,它稍微更改了列名(将作业添加到作业列的开头)。