У меня есть табличка со столбцом символов. Символ в каждой строке представляет собой набор таких слов: «тип:мойтип,переменная:мояпеременная,переменная:моядругаяпеременная:подпеременнаяэтойдругойпеременной». Такие вещи. Я хочу либо преобразовать это в столбцы в моей таблице (столбец «тип», столбец «переменная» и т. д., но тогда я действительно не знаю, что делать с моими словами 3-го уровня), либо преобразовать его в список столбцов x, так что x имеет структуру подсписков: x$type, x$variable, x$variable$myothervariable.
Я не уверен, что это лучший подход, но также я не знаю, как реализовать эти два подхода, которые я предлагаю здесь. Я должен сказать, что у меня максимум 3 уровня и больше слов 1-го уровня, чем «тип» и «переменная».
Небольшой воспроизводимый пример:
df <- tibble()
df$id<- 1:3
df$keywords <- c(
"type:novel,genre:humor:black,year:2010"
"type:dictionary,language:english,type:bilingual,otherlang:french"
"type:essay,topic:philosophy:purposeoflife,year:2005"
)
# expected would be in idea 1:
colnames(df)
# n, keywords, type, genre, year,
# language, otherlang, topic
# on idea 2:
colnames(df)
# n, keywords, keywords.as.list
Мы можем использовать separate_rows
из tidyr
, чтобы разделить столбец «ключевые слова» на ,
, затем с помощью cSplit
разделить столбец «ключевые слова» на несколько столбцов в :
, изменить форму в «длинный» формат с помощью pivot_longer
, а затем снова изменить форму на «широкий» с помощью pivot_wider
library(dplyr)
library(tidyr)
library(data.table)
library(splitstackshape)
df %>%
separate_rows(keywords, sep = ",") %>%
cSplit("keywords", ":") %>%
pivot_longer(cols = keywords_2:keywords_3, values_drop_na = TRUE) %>%
select(-name) %>%
mutate(rn = rowid(id, keywords_1)) %>%
pivot_wider(names_from = keywords_1, values_from = value) %>%
select(-rn) %>%
type.convert(as.is = TRUE)
-выход
# A tibble: 6 x 7
# id type genre year language otherlang topic
# <int> <chr> <chr> <int> <chr> <chr> <chr>
#1 1 novel humor 2010 <NA> <NA> <NA>
#2 1 <NA> black NA <NA> <NA> <NA>
#3 2 dictionary <NA> NA english french <NA>
#4 2 bilingual <NA> NA <NA> <NA> <NA>
#5 3 essay <NA> 2005 <NA> <NA> philosophy
#6 3 <NA> <NA> NA <NA> <NA> purposeoflife
df <- structure(list(id = 1:3, keywords = c("type:novel,genre:humor:black,year:2010",
"type:dictionary,language:english,type:bilingual,otherlang:french",
"type:essay,topic:philosophy:purposeoflife,year:2005")), row.names = c(NA,
-3L), class = c("tbl_df", "tbl", "data.frame"))
Можете ли вы показать небольшой воспроизводимый пример и ожидаемый результат. Спасибо