我有一个如下所示的数据框:
其余数据框 | columnToSeparate |
---|---|
blablarow1 | {"info1":"row1string1","info2":"row1string2"} |
blablarow2 | {"info1":"row2string1","info2":"row2string2"} |
在我的数据框中将这些信息作为单独的列提取以获得类似信息的最佳方法是什么:
其余数据框 | 信息1 | 信息2 |
---|---|---|
blablarow1 | row1string1 | row1string2 |
blablarow2 | row2string1 | row2string2 |
这是创建数据框的代码
df <- data.frame(RestOfDF = c("blablarow1", "blablarow2"),
columnToSeparate = c('{"info1":"row1string1","info2":"row1string2"}',
'{"info1":"row2string1","info2":"row2string2"}'))
更新:我真正的专栏有很多信息字段,所以我希望尽可能自动地做一些事情,因为名称实际上是不同的。就像是 {"mydogsname":"pinky","mycatsfood":"icecream"...}
答案 0 :(得分:3)
清理 columnToSeparate
列,删除不需要的文本(即删除 ["{}]
),通过逗号分隔 (,
) 将文本拆分为不同的行,并通过冒号 ({ {1}})。使用 :
获取宽格式数据。
pivot_wider
答案 1 :(得分:3)
我认为这也有帮助:
library(dplyr)
library(stringr)
df %>%
magrittr::extract(1) %>%
bind_cols(str_extract_all(df$columnToSeparate, "(\\w+\\d+)(\\w+\\d+)", simplify = TRUE) %>%
as_tibble() %>%
setNames(c("info1", "info2")))
RestOfDF info1 info2
1 blablarow1 row1string1 row1string2
2 blablarow2 row2string1 row2string2
答案 2 :(得分:1)
这是一个 dplyr
和 stringr
解决方案:
library(stringr)
library(dplyr)
df %>%
# get rid of metachars:
mutate(columnToSeparate = gsub('[\\"{}]', '', columnToSeparate)) %>%
# extract `info1` using lookbehind and lookahead:
mutate(info1 = str_extract(columnToSeparate, "(?<=:)[^,:]+(?=,)")) %>%
# extract `info2` using lookbehind and lookahead:
mutate(info2 = str_extract(columnToSeparate, "(?<=:)[^,:]+(?=$)")) %>%
# remove obsolete column:
select(-2)
RestOfDF info1 info2
1 blablarow1 row1string1 row1string2
2 blablarow2 row2string1 row2string2
答案 3 :(得分:0)
显然,columnToSeparate
是 JSON 格式。所以,我们可以
fromJSON()
包中的 jsonlite
函数解析数据,rbindlist()
包中的 data.table
创建具有单独列的 data.frame,df
结合起来。setDT(df)[, rbindlist(Map(jsonlite::fromJSON, columnToSeparate),
fill = TRUE, idcol = "columnToSeparate")][
df, on = "columnToSeparate"][
, columnToSeparate := NULL][]
<块引用>
info1 info2 info4 RestOfDF
1: row1string1 row1string2 <NA> blablarow1
2: row2string1 row2string2 <NA> blablarow2
3: <NA> <NA> <NA> blablarow3
4: <NA> <NA> row4string4 blablarow4
请注意,已使用修改后的数据集来涵盖其他边缘情况,因为 OP 已提到“名称实际上不同”。
df <- data.frame(RestOfDF = paste0("blablarow", 1:4),
columnToSeparate = c('{"info1":"row1string1","info2":"row1string2"}',
'{"info1":"row2string1","info2":"row2string2"}',
'{}',
'{"info4":"row4string4"}'))
第 1 到第 2 行取自 OP 的原始数据集。
第 3 行没有数据。
第 4 行只有一个数据项并使用不同的名称。