2017-08-30 50 views
0

我需要您的帮助,因为我得到了格式非常困难的数据帧。我的数据帧在新列中拆分数据帧的字符串

data <- data.frame(information = c("{u'info1': u'mnfd', u'text': u'exampletext'}","{u'info2': u'332', u'text': u'lalala'}","{u'info1': u'', u'text': u'blub'}")) 

有列信息(在实际数据帧中的一些其他列),看上去例如像

##         information 
## 1 {u'info1': u'mnfd', u'text': u'exampletext'} 
## 2  {u'info2': u'332', u'text': u'lalala'} 
## 3   {u'info1': u'', u'text': u'blub'} 

真正的数据帧有几千行和字符串要长得多。我想添加应显示字符串信息的列。所以在最后我想有一个数据帧寻找像(字符串“of_”每columnn名称前添加)

        information of_info1  of_text of_info2 
1 {u'info1': u'mnfd', u'text': u'exampletext'}  mnfd exampletext  <NA> 
2  {u'info2': u'332', u'text': u'lalala'}  <NA>  lalala  322 
3   {u'info1': u'', u'text': u'blub'}     blub  <NA> 

感谢您的帮助

回答

3

这是接近JSON文件,所以做一些格式化以便正确使用,然后导入vi一个真棒jsonlite包:

library(jsonlite) 
fromJSON(paste0("[", paste(gsub("(u|)'",'"',data$information), collapse=",\n"), "]")) 

# info1  text info2 
#1 mnfd exampletext <NA> 
#2 <NA>  lalala 332 
#3    blub <NA> 
1

下面是与dplyrstringr版本。如果你愿意的话,把它翻译成基本的R不应该太难。

但是,如果字段中存在单引号转义,则会中断。

library(stringr) 
library(dplyr) 

    data <- data$information %>% str_match_all("u'([^']+)': u'([^']*)'") %>% 
     lapply(function(matches) { 
     result <- data.frame(as.list(matches[,3]), stringsAsFactors = FALSE) 
     colnames(result) <- paste0("of_", matches[,2]) 
     result 
     }) %>% bind_rows() %>% bind_cols(data, .) 
1

将其转换为DCF格式,然后使用read.dcf进行读取。没有包被使用。

首先我们删除给予s0的垃圾,然后将它拆分为逗号空间给予s1。然后在记录之间添加一个空的终止行,给出s2。最后使用read.dcf来读取并附加到data

s0 <- gsub("[{}]", "", gsub("u'(.*?)'", "\\1", data$information)) 
s1 <- strsplit(s0, ", ") 
s2 <- unlist(lapply(s1, c, "")) 
cbind(data, read.dcf(textConnection(s2))) 

,并提供:

        information info1  text info2 
1 {u'info1': u'mnfd', u'text': u'exampletext'} mnfd exampletext <NA> 
2  {u'info2': u'332', u'text': u'lalala'} <NA>  lalala 332 
3   {u'info1': u'', u'text': u'blub'}    blub <NA> 

magrittr

这也可以表示为一个嵌套magrittr管道是这样的:

library(magrittr) 

data %>% 
    cbind({.$information %>% 
     gsub("u'(.*?)'", "\\1", .) %>% 
     gsub("[{}]", "", .) %>% 
     strsplit(", ") %>% 
     lapply(c, "") %>% 
     unlist %>% 
     textConnection %>% 
     read.dcf 
    })