L oop через элементы во фрейме данных и добавить строку в зависимости от условия - PullRequest
1 голос
/ 20 марта 2020

У меня есть фрейм данных как таковой:

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

1 Ответ

1 голос
/ 20 марта 2020

Вы можете использовать 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

Вы можете получить желаемый результат с помощью расширенного примера, поместив его в al oop, хотя я уверен, что есть лучшие подходы:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...