我有一个数据集,其中的#标签列包含可变数量的#标签,并用分隔;。例如:
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似乎不适用于这里。非常感谢。
一个选项是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,它将自动选择数据中所有可能的分隔符