以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”标记了这个问题,因为它们看起来很有希望。但是我在这方面可能是错的。谢谢你的帮助。抱歉,如果我忽略了答案。
答案 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))