R:将字符向量(json)中的整数转换为多个布尔列

时间:2017-11-20 17:41:33

标签: json r tidyverse

我实际上有一个2000行(不同日期)的数据框,每行包含一个字符“vector”,其中包含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)的方向,然后是for - 包含cbind的循环。
但必须有更好的方法吗?整洁的诗?我希望有人展示:正则表达式和Map-command

2 个答案:

答案 0 :(得分:0)

您只需使用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

在我看来,无需使用地图或任何tidyverse包。

答案 1 :(得分:0)

非常酷的解决方案,正是我需要的。我只需要移除括号即可使其工作。所以,想象我的矢量&#34; S_total&#34;有括号,我必须:

S_total_nobracket <- gsub("\\[|\\]", "", S_total).

感谢工厂,感谢您的回答。这正是我所需要的: - )