循环遍历数据框中的元素,并根据条件添加一行

时间:2020-03-20 01:02:31

标签: r dataframe

我有这样的数据框:

> 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 ")

1 个答案:

答案 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