【问题标题】:How to transform a key/value string into separate columns?如何将键/值字符串转换为单独的列?
【发布时间】:2016-07-01 11:18:17
【问题描述】:

我有一个 data.framekey/value string 列,其中包含有关一组用户的功能及其值的信息。像这样的:

data<-data.frame(id=1:3,statid=c("s003e","s093u","s085t"),str=c("a:1,7:2","a:1,c:4","a:3,b:5,c:33"))
data
#   id statid          str
# 1  1  s003e      a:1,7:2
# 2  2  s093u      a:1,c:4
# 3  3  s085t a:3,b:5,c:33

我要做的是为每个功能创建一个包含列的 data.frame。像这样:

data_after<-data.frame(id=1:3,statid=c("s003e","s093u","s085t"),
                   a=c(1,1,3),b=c(0,0,5),c=c(0,4,33),"7"=c(2,0,0))
data_after
#   id statid a b  c X7
# 1  1  s003e 1 0  0  2
# 2  2  s093u 1 0  4  0
# 3  3  s085t 3 5 33  0

我试图使用stringr 包中的str_split,然后将创建的列表的元素转换为data.frames(稍后使用例如rbind.fillplyr 绑定它们)但无法做到。任何帮助将不胜感激!

【问题讨论】:

  • splitstackshape 包。

标签: r split multiple-columns key-value


【解决方案1】:

您可以使用dplyrtidyr

library(dplyr); library(tidyr)
data %>% mutate(str = strsplit(str, ",")) %>% unnest(str) %>% 
         separate(str, into = c('var', 'val'), sep = ":") %>% spread(var, val, fill = 0)

#   id statid 7 a b  c
# 1  1  s003e 2 1 0  0
# 2  2  s093u 0 1 0  4
# 3  3  s085t 0 3 5 33

【讨论】:

    【解决方案2】:

    我们可以使用cSplit 以更简洁的方式执行此操作。通过在, 处拆分将数据转换为“长”格式,然后在:dcast 处从“长”拆分为“宽”

    library(splitstackshape)
    library(data.table)
    dcast(cSplit(cSplit(data, "str", ",", "long"), "str", ":"), 
                        id+statid~str_1, value.var="str_2", fill = 0)
    #   id statid 7 a b  c
    #1:  1  s003e 2 1 0  0
    #2:  2  s093u 0 1 0  4
    #3:  3  s085t 0 3 5 33
    

    【讨论】:

      猜你喜欢
      • 2022-10-15
      • 1970-01-01
      • 2018-01-22
      • 2021-05-14
      • 2021-10-07
      • 2013-08-11
      • 2020-12-07
      • 1970-01-01
      • 2017-08-03
      相关资源
      最近更新 更多