2017-08-30 45 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 
    })