【问题标题】:Create new numeric columns from 1 string column从 1 个字符串列创建新的数字列
【发布时间】:2016-06-14 13:03:44
【问题描述】:

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

最好的方法是什么?

谢谢。


【问题讨论】:

  • 您能否添加可重现的数据样本(可以直接从您的问题而不是链接访问)?
  • 不完全是您想要做的,但请查看 R 中的 factor 函数
  • @BryanGoggin 数据样本是什么意思?在此处复制并粘贴 .csv 文件?
  • @user2864849 这没有多大帮助,但 JTT 已经成功了,谢谢!

标签: r loops dataframe comparison


【解决方案1】:

您当然可以使用 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 列(job 和 id)并将它们转换为上述形式可以如下完成:

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

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

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

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

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


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

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

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

【讨论】:

  • 谢谢,这两种方法确实有效!现在我只需要删除作业列并将其他列字符串值更改为数字值。 (-1、0、1 等)。但是在上面的代码中,最后一个也是最有效的一个,我不明白它的语法。请你解释一下好吗? cbind 究竟做了什么,model.matrix 及其参数是什么?
  • 函数model.matrix 将R 因子(“分类变量”)转换为可用于线性模型(回归)的模型矩阵。它将一个公式作为参数,该公式说明如何构建模型矩阵。示例中的公式从矩阵中删除截距项(第 0 项,用 1 填充的列),然后将工作因素的水平重新编码为单独的列。您可能想阅读关于 ?model.matrix?formula 的 R 帮助。函数 cbind 通过将两个对象的列组合在一起来创建一个新对象。
  • 您可以通过运行来测试model.matrix 的功能,例如head(model.matrix( ~ 0 + job, bank))。这为您提供了结果对象的前几行。
  • 在 R 中使用cbind 组合两个不同的对象(数据框、矩阵)时,它们需要具有相同的行数。否则组合失败。
  • 这绝对解决了很多疑问,谢谢!最后一个提示真的很重要呵呵。抱歉,我不能投票赞成您的回答(没有声誉),但我接受了。 :) 再次感谢。
猜你喜欢
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
相关资源
最近更新 更多