У меня есть датафрейм
data.frame(string = c('["jewelry","tailor","Jewelry"]', '["apple","banana","orange"]'))
Я хочу создать три столбца и две строки... Я хочу, чтобы фрейм данных выглядел как
data.frame(string1 = c('jewelry','apple'), string2=c('tailor','banana'), string3=c('jewelry','orange'))
В base R
мы могли бы удалить скобки и использовать read.csv
для чтения столбца в data.frame
read.csv(text = gsub('\\[|\\]|"', "", df1$string),
header = FALSE, col.names = paste0("string", 1:3))
-выход
string1 string2 string3
1 jewelry tailor Jewelry
2 apple banana orange
Или с помощью tidyverse
library(dplyr)
library(stringr)
library(tidyr)
df1 %>%
mutate(string = str_remove_all(string, '\\[|\\]|"')) %>%
separate_wider_delim(string, delim = ',',
names = c("string1", "string2", "string3"))
-выход
# A tibble: 2 × 3
string1 string2 string3
<chr> <chr> <chr>
1 jewelry tailor Jewelry
2 apple banana orange
df1 <- data.frame(string = c('["jewelry","tailor","Jewelry"]',
'["apple","banana","orange"]'))
необязательный подход tidyverse, если вы заранее знаете максимальное количество столбцов и не имеете пробелов, которые имеют значение с точки зрения упорядочения или назначения столбцов (строки с менее чем 3 столбцами в этом примере):
# dummy data
myDf <- data.frame(string = c('["jewelry","tailor","Jewelry"]', '["apple","banana","orange"]'))
library(dplyr)
library(tidyr)
myDf %>%
# select column to split, new column names and regex with capture groups (parts between brakets
tidyr::extract(string, into = c("a", "b", "c"), regex = '"(\\w*)","(\\w*)","(\\w*)"')
a b c
1 jewelry tailor Jewelry
2 apple banana orange
Это похоже на действительный список python/json.
Использование ретикулята:
library(tidyverse)
df1%>%
rowwise() %>%
transmute(string=list(reticulate::py_eval(string)))%>%
unnest_wider(string, names_sep = '')
#> # A tibble: 2 × 3
#> string1 string2 string3
#> <chr> <chr> <chr>
#> 1 jewelry tailor Jewelry
#> 2 apple banana orange
используя jsonlite
:
a <- jsonlite::fromJSON(paste('[', paste(df1$string, collapse = ','), ']'))
setNames(data.frame(a), paste0('string', seq(ncol(a))))
#> string1 string2 string3
#> 1 jewelry tailor Jewelry
#> 2 apple banana orange
или даже:
d <- do.call(rbind, lapply(df1$string, jsonlite::fromJSON))
setNames(data.frame(d), paste0('string', seq(ncol(d))))
string1 string2 string3
1 jewelry tailor Jewelry
2 apple banana orange
jsonlite
через столбец списка и unnest_wider
:
library(dplyr)
library(tidyr)
library(purrr)
library(jsonlite)
df <- data.frame(string = c('["jewelry","tailor","Jewelry"]',
'["apple","banana","orange"]'))
df %>%
mutate(string = map(string, ~ parse_json(.x))) %>%
unnest_wider(string, names_sep = "")
#> # A tibble: 2 × 3
#> string1 string2 string3
#> <chr> <chr> <chr>
#> 1 jewelry tailor Jewelry
#> 2 apple banana orange
Created on 2023-02-13 with reprex v2.0.2