分隔字符列并在r中转换为整齐的格式

zes*_*sla 0 r dplyr tidyr

我有一个数据集,其中的#标签列包含可变数量的#标签,并用分隔;。例如:

id  hashtags
1   #apple;#peach           
2   #apple          
3   #pear;#orange;#banana
Run Code Online (Sandbox Code Playgroud)

我需要做的是将列分开并将其转换为整洁的数据。因此,每一行都包含ID和一个单独的#标签。

id  hashtag
1   #apple          
1   #peach          
2   #apple          
3   #pear           
3   #orange         
3   #banana
Run Code Online (Sandbox Code Playgroud)

我可以使用下面的循环来做到这一点。

library(tidyverse)
df = data.frame(id=1:3, hashtags=c("#apple;#peach", "#apple", "#pear;#orange;#banana"))

dat = data.frame()
for (i in 1:nrow(df)) {
  dt = data.frame(id = df$id[i], 
                  hashtag = str_split(df$hashtags[i], ';')[[1]])
  dat = bind_rows(dat, dt)
}
Run Code Online (Sandbox Code Playgroud)

但是我认为上述方法不是一个好的解决方案。当我有一个非常大的数据集(我的实际数据)时,我发现它非常慢。

有没有人有更好,更快的方法来实现这一目标?请注意,每个ID的#标签数量变化很大。tidyr::separate似乎不适用于这里。非常感谢。

akr*_*run 5

一个选项是separate_rows并指定sep

library(tidyverse)
df %>% 
   separate_rows(hashtags, sep=";")
#. id hashtags
#1  1   #apple
#2  1   #peach
#3  2   #apple
#4  3    #pear
#5  3  #orange
#6  3  #banana
Run Code Online (Sandbox Code Playgroud)

如果不指定sep,它将自动选择数据中所有可能的分隔符