【发布时间】:2021-07-21 02:45:08
【问题描述】:
我有一个数据框,其中一列有多个信息,用“;”分隔,如下所示:
DF = data.frame(a = c(1,1,1,2,2), b = c('aaa','aaa','aba','abc','ccc'),
extra_info = c(
'animal=horse;color=orange;shape=circle',
'animal=monkey;shape=square;value=532',
'animal=horse;color=blue;shape=square;value=321',
'animal=dog;color=green;value=678',
'color=pink;shape=triangle'
))
我不能使用 read.table ,因为我已经在使用不同的函数来读取数据(而且 extra_info 列中每一行的内容也不同,并且列会被弄乱)。我想做的是将所有这些信息分开到不同的列,并相应地分配适当的名称,例如:
a b animal color shape value
1 aaa horse orange circle NA
1 aaa monkey NA square 532
1 aba horse blue square 321
2 abc dog green NA 678
2 ccc NA pink triangle NA
到目前为止,我已经尝试过:
new_cols = DF %>% separate(extra_info, c(LETTERS[1:4]), sep = ";")
new_cols %>% separate(A, c("key","value"), sep = '=') %>%
separate(B, c("key","value"), sep = '=') %>%
separate(C, c("key","value"), sep = '=') %>%
separate(D, c("key","value"), sep = '=') %>%
pivot_wider(names_from = c("key"), values_from = c("value"))
但它并没有按预期工作。
【问题讨论】:
-
查看
tidyr::separate。这将为您拆分;上的列。然后遍历每一列并解析它。如果您需要更多帮助,请提供minimal reproducible example。 -
感谢您的评论。我试过分开,效果很好,虽然我不知道可能出现的所有可能类型的信息,所以在某些列中存在不匹配。
-
您实际上可以使用
separate twice。一次用于;,一次用于所有结果列,在=上拆分以分离为键和值列。然后,您可以使用pivot_wider将键和值旋转到每个键的单独列中。 -
我了解步骤,但我还没有弄清楚如何实现它。我编辑了这篇文章,我认为它现在更易于理解和重现。非常感谢您的帮助!
标签: r string dplyr tidyverse extract