跨列传播字符串

Spread Strings across Columns

我有以下示例数据:

df

val_str
fruit=apple,machine=crane
machine=crane
machine=roboter
fruit=apple
machine=roboter,food=samosa

df2

fruit   machine   food
apple   crane     NA
NA      crane     NA
NA      roboter   NA
apple   NA        NA
NA      roboter   samosa

如何从 df 转到 df2? “=”之前的每个唯一值都应创建一列,然后属于该列的相应值应分布在各行中。

代码:

df <- data.frame(val_str = c("fruit=apple,machine=crane","machine=crane","machine=roboter", "fruit=apple", "machine=roboter,food=samosa"))

df2 <- data.frame(fruit = c("apple",NA,NA,"apple","NA"),
                 machine = c("crane","crane","roboter",NA,"roboter"),
                 food = c(NA,NA,NA,NA,"samosa"))

我们可以在 'val_str' 列上执行 strsplit,通过遍历 list 元素来自 map

library(dplyr)
library(purrr)
strsplit(as.character(df$val_str), "[=,]") %>% 
       map_df(~  setNames(as.data.frame.list(.[c(FALSE, TRUE)]), .[c(TRUE, FALSE)])) 
#  fruit machine   food
#1 apple   crane   <NA>
#2  <NA>   crane   <NA>
#3  <NA> roboter   <NA>
#4 apple    <NA>   <NA>
#5  <NA> roboter samosa