我有data.frame
个key/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
我尝试使用str_split
包中的stringr
,然后将已创建列表的元素转换为data.frames
(稍后使用rbind.fill
从plyr
绑定它们但是无法完成它。任何帮助将不胜感激!
答案 0 :(得分:3)
您可以使用dplyr
和tidyr
:
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
答案 1 :(得分:2)
我们可以使用cSplit
以更清洁的方式执行此操作。通过在,
处拆分将数据转换为“长”格式,然后在:
和dcast
处从“long”拆分为“wide”
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