首页 > 解决方案 > 循环遍历数据框中的元素并根据条件添加一行

问题描述

我有一个这样的数据框:

> 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

更新:

另一种情况是当我们有多个包含“合并”的列时:

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

标签: rdataframe

解决方案


您可以使用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

推荐阅读