簡體   English   中英

從 R tibble 中的字符創建列表

[英]create list from characters in R tibble

我有一個帶有字符列的小標題。 每行中的字符是一組像這樣的單詞:“type:mytype,variable:myvariable,variable:myothervariable:asubvariableofthisothervariable”。 像這樣的東西。 我想將其轉換為我的 tibble 中的列(列“類型”、列“變量”等;但是我真的不知道如何處理我的 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

我們可以使用tidyr中的separate_rows將“關鍵字”列拆分為, ,然后使用cSplit將“關鍵字”列拆分為:處的多個列,使用pivot_wider重塑為“long”格式,然后使用pivot_longer重塑回“wide”

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"))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM