在R中,如何根据另一列添加计数为0/1的多列?

时间:2019-02-09 11:38:11

标签: r dplyr aggregate

以R中的mtcars数据集为例,我想为每种汽车的mtcars数据框添加额外的列。 通过此行,我可以得到汽车模型:

unique(sapply((strsplit(row.names(mtcars), " ")), "[[", 1))

我想添加22列。每种车型的新列:

length(unique(sapply((strsplit(row.names(mtcars), " ")), "[[", 1)))

我想出的是这段代码:

mtcars01 <- mtcars
car.nms <- sapply((strsplit(row.names(mtcars), " ")), "[[", 1)
mtcars01$Mazda <- (car.nms=="Mazda")*1
mtcars01$Datsun <- (car.nms=="Datsun")*1
mtcars01$Hornet <- (car.nms=="Hornet")*1

等等,依此类推...遍历所有汽车模型,直到为每个汽车模型添加一个新列,其中包含零和一。这就是我所追求的。然后,我可以遍历所有独特的汽车模型,但是我不希望不添加循环。如果可能的话。

我自己的输入数据框看起来与mtcars数据集相似,但是我拥有不同数量的汽车模型,并且希望将此代码重用于汽车模型数量不同的数据帧。我自己的数据框可能只有3个汽车模型,那么我将需要在我的数据框中添加3个额外的列,其中这些汽车模型的零和一。我用“聚合”和“ dplyr”标记了这个问题,因为它们看起来很有希望。但是我在这方面可能是错的。谢谢你的帮助。抱歉,如果我忽略了答案。

2 个答案:

答案 0 :(得分:0)

一种选择是遍历'car.nms'的unique元素,将(==)与'car.nms'的值进行比较,并将逻辑矩阵强制转换为二进制({ {1}})

+

或者使用mtcars01[unique(car.nms)] <- +(sapply(unique(car.nms), `==`, car.nms)) ,使用tidyverse(从word获取行名的第一个单词,stringr行名列,使用pull(来自mtabulate),并将列与原始数据绑定

qdapTools

答案 1 :(得分:0)

另一种选择是使用model.matrix

cbind(mtcars, model.matrix(~ car.nms - 1))