mok*_*oku 5 r apply plyr reshape dplyr
遇到如何虚拟编码以下数据集的问题.
示例数据,比方说dataframe = mydata:
ID | NAMES |
-- | -------------- |
1 | 4444, 333, 456 |
2 | 333 |
3 | 456, 765 |
Run Code Online (Sandbox Code Playgroud)
我想只将NAMES中的唯一变量作为列变量和代码转换为每行是否具有该变量,即1或0
期望的输出:
ID | NAMES | 4444 | 333 | 456 | 765 |
-- | -------------- |------|-----|-----|-----|
1 | 4444, 333, 456 | 1 | 1 | 1 | 0 |
2 | 333 | 0 | 1 | 0 | 0 |
3 | 456, 765 | 0 | 0 | 1 | 1 |
Run Code Online (Sandbox Code Playgroud)
到目前为止我所做的是创造了一个独特的矢量
split <- str_split(string = mydata$NAMES,pattern = ",")
vec <- unique(str_trim(unlist(split)))
remove <- ""
vec <- as.data.frame(vec[! vec %in% remove])
colnames(vec) <- "var"
vecRef <- as.vector(vec$var)
namesCast <- dcast(data = vec,formula = .~var)
namesCast <- nameCast[,2:ncol(namesCast)]
Run Code Online (Sandbox Code Playgroud)
这产生了具有空间/不规则性的独特NAMES的矢量.从那里我不知道如何进行匹配/虚拟编码,所以任何帮助将不胜感激!
您可以使用cSplit_e我的"splitstackshape"包,如下所示:
library(splitstackshape)
cSplit_e(mydata, "NAMES", sep = ",", type = "character", fill = 0)
# ID NAMES NAMES_333 NAMES_4444 NAMES_456 NAMES_765
# 1 1 4444, 333, 456 1 1 1 0
# 2 2 333 1 0 0 0
# 3 3 456, 765 0 0 1 1
Run Code Online (Sandbox Code Playgroud)
如果要查看使用这些参数时调用的基础函数,可以查看splitstackshape:::charMat,它list生成strsplit并生成一个matrix.
直接调用函数会给你这样的东西:
splitstackshape:::charMat(
lapply(strsplit(as.character(mydata$NAMES), ","),
function(x) gsub("^\\s+|\\s$", "", x)))
# 333 4444 456 765
# [1,] 1 1 1 NA
# [2,] 1 NA NA NA
# [3,] NA NA 1 1
Run Code Online (Sandbox Code Playgroud)