【问题标题】:Casting unique features in column to variable names and dummy coding original features into variables in R将列中的独特特征转换为变量名称,并将原始特征虚拟编码为 R 中的变量
【发布时间】:2015-02-01 05:03:40
【问题描述】:

在如何对以下数据集进行虚拟编码时遇到问题。

示例数据,假设 dataframe = mydata:

ID |     NAMES      |
-- | -------------- |
1  | 4444, 333, 456 |
2  | 333            |
3  | 456, 765       |

我只想将 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 |

到目前为止我所做的是创建了一个独特的向量

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)]

这会产生一个包含唯一名称的向量,其中删除了空格/不规则性。从那里我不知道如何进行匹配/虚拟编码,所以任何帮助将不胜感激!

【问题讨论】:

    标签: r plyr apply reshape dplyr


    【解决方案1】:

    您可以使用我的“splitstackshape”包中的cSplit_e,如下所示:

    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
    

    如果您想查看使用这些参数时调用的底层函数,可以查看splitstackshape:::charMat,它采用strsplit 生成的list 并从中创建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 
    

    【讨论】:

    • 哈,我知道有人会回来写一行让我大吃一惊的代码。谢谢,效果很好!
    猜你喜欢
    • 2020-02-02
    • 2022-11-04
    • 2017-05-23
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多