我需要你的帮助,因为我的格式非常困难。我的数据框
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'}
真实数据框有几千行,字符串更长。我想添加应显示字符串信息的列。所以最后我希望有一个类似的数据框(字符串&#34; _&#34;在每个列名之前添加)
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>
感谢您的帮助
答案 0 :(得分:3)
这是接近JSON文件,所以做一些格式化以使其正确,然后通过令人敬畏的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 :(得分:1)
以下是包含dplyr
和stringr
的版本。如果您愿意,将它翻译成基础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, .)
答案 2 :(得分: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
})