【问题标题】:R: convert integers in a character vector (json) to multiple boolean columnsR:将字符向量(json)中的整数转换为多个布尔列
【发布时间】:2017-11-20 17:41:33
【问题描述】:

我实际上有一个包含 2000 行(不同日期)的数据框,每行包含一个字符“向量”,其中包含 30 种不同技能的二进制信息。如果该技能已被使用,它的编号会出现在矢量中。但为了简化:
如果我有一个包含 10 种不同技能的 3 次观察(3 天)的数据框 - 命名为 "S_total":
S_total= [1,3,7,8,9,10], [5,9], [],还有一个变量 Day= 1,2,3 我想构建一个 3 行 12 列的数据框
列是:Day,S_total,,s1,s,2,s3,s4,s5,s6,s7,s8,s9,s10 其中编号变量的格式可以是true/false

我已经想到了as.numeric(read.csv) 的方向,然后是一个包含cbindfor-loop。
但是一定有更好的方法吗?整齐的诗句?我希望有人演示:正则表达式和 Map-command

【问题讨论】:

    标签: json r tidyverse


    【解决方案1】:

    您可以使用dataFrame$newColumndataFrame[, "newColum] 简单地添加一个新列。然后可以使用grepl 来测试是否在向量dataFrame$S_total 中找到技能。例如

    dataFrame[, "1"] <- grepl("1", dataFrame$S_total)
    

    要获得数据集中出现的所有不同技能,您可以将字符向量拆分为单个数字,然后使用唯一的。然后,您可以遍历所有不同的技能并为每个技能创建一个新列:

     > dataFrame <- data.frame(S_total = c(toString(c(1,3,7,8,11,20)),  toString(c(5,12)), ""),
        +                         Day = c(1,2,3),
        +                         stringsAsFactors = FALSE)
        > 
        > dataFrame
                     S_total Day
        1 1, 3, 7, 8, 11, 20   1
        2              5, 12   2
        3                      3
        > 
        > allSkill <- sort(unique(unlist(strsplit(dataFrame$S_total, ", "))))
        > for(i in allSkill){
        +   dataFrame[, i] <- grepl(i, dataFrame$S_total)
        + }
        > dataFrame
                     S_total Day     1    11    12    20     3     5     7     8
        1 1, 3, 7, 8, 11, 20   1  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE
        2              5, 12   2  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE
        3                      3 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    

    如果您的数据集不是那么大,则可以这样做。如果你有一个非常大的集合并且性能很重要,你可以先创建空列,然后循环遍历它们,这会提高性能see

    在我看来,不需要使用 map 或任何 tidyverse 包。

    【讨论】:

    • 我是新手,还不能给分 - 但非常感谢,谢谢
    【解决方案2】:

    非常酷的解决方案,正是我所需要的。我只需要删除我的括号来让它工作。所以,想象我的向量“S_total”有括号,我必须:

    S_total_nobracket &lt;- gsub("\\[|\\]", "", S_total).

    谢谢你的回答。这正是我所需要的:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 2023-01-18
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      相关资源
      最近更新 更多