在新列中拆分数据框的字符串

时间:2017-08-30 23:24:11

标签: r string dataframe

我需要你的帮助,因为我的格式非常困难。我的数据框

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>

感谢您的帮助

3 个答案:

答案 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)

以下是包含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, .)

答案 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
     })