我有这样的数据框:
> df <- data.frame(var1 = c("1 Merge 2 ","3"),
+ var2 = c("1","2 Merge 3"),
+ var3 = "1")
> df
var1 var2 var3
1 1 Merge 2 1 1
2 3 2 Merge 3 1
当'Merge'在一个元素中时,我想用'Merge'之前和之后的字符串分割行。我希望对此进行概括,因此,如果我们有1 Merge 2 Merge 3
,应该从中输出3行。
以下是我上面期望的输出示例:
> desired_df <- data.frame(var1 = c("1","2","3","3"),
+ var2 = c("1","1","2","3"),
+ var3 = c("1","1","1","1"))
> desired_df
var1 var2 var3
1 1 1 1
2 2 1 1
3 3 2 1
4 3 3 1
更新:
另一种情况是,当我们有不止一个带有'Merge'的列时:
> df
var1 var2 var3
1 1 Merge 2 Merge 4 1 1 Merge 2
2 3 2 Merge 3 1
> desired_df <- data.frame(var1 = c(1,1,2,2,4,4,3,3),
+ var2 = c(1,1,1,1,1,1,2,3),
+ var3 = c(1,2,1,2,1,2,1,1))
> desired_df
var1 var2 var3
1 1 1 1
2 1 1 2
3 2 1 1
4 2 1 2
5 4 1 1
6 4 1 2
7 3 2 1
8 3 3 1
解决方案:
我们可以在每个变量上使用管道和separate_rows()
,如下所示:
df %>%
separate_rows(var1, sep = " Merge ") %>%
separate_rows(var2, sep = " Merge ") %>%
separate_rows(var3, sep = " Merge ")
答案 0 :(得分:1)
您可以使用tidyr::separate_rows()
。
library(tidyr)
df %>%
separate_rows(var1:var3, sep = " Merge ")
var1 var2 var3
1 1 1 1
2 2 1 1
3 3 2 1
4 3 3 1
尽管可以肯定有更好的方法,但可以通过将示例放入循环中来获得所需的结果:
for(i in seq_along(df)) {
df <- separate_rows(df, i, sep = " Merge ")
}
df
var1 var2 var3
1 1 1 1
2 1 1 2
3 2 1 1
4 2 1 2
5 3 2 1
6 3 3 1