R вставить строки с последовательностью - PullRequest
2 голосов
/ 19 февраля 2020
foo <- data.frame("var1"=c(123,123,123),"var2"=c(45,57,57),"var3"=c(1,3,6),"count"=c(1,1,1))
  var1 var2 var3 count
1  123   45    1     1
2  123   57    3     1
3  123   57    6     1

Я хочу заполнить var3 числами от 1 до 6 для каждого объекта в var2 , сохранить данные из исходного кадра данных и считать до 0.

   var1 var2 var3 count
1   123   45    1     1
2   123   45    2     0
3   123   45    3     0
4   123   45    4     0
5   123   45    5     0
6   123   45    6     0
7   123   57    1     0
8   123   57    2     0
9   123   57    3     1
10  123   57    4     0
11  123   57    5     0
12  123   57    6     0
13  123   57    1     0
14  123   57    2     0
15  123   57    3     0
16  123   57    4     0
17  123   57    5     0
18  123   57    6     1 

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Этот вопрос уже сделан. Но я хочу оставить другой способ, используя data.table для вас. Я прочитал ваш комментарий выше. Следовательно, мой вывод отличается от вывода tmfmnk. Здесь я использовал подмножества в качестве объединений. Я в основном создаю все возможные комбинации var1, var2 и var3. Длина var2 и var3 (var3 имеет 1: 6 для каждого значения var2) расположены так, что их длины совпадают. После этого я заменил NA на 0, используя nafill().

library(data.table)

setDT(foo)[.(var1,
             rep(unique(var2), each = max(var3)),
             rep(1:max(var3), times = uniqueN(var2))),
             on = .(var1, var2, var3)][, count := nafill(count, fill = 0)][]

    var1 var2 var3 count
 1:  123   45    1     1
 2:  123   45    2     0
 3:  123   45    3     0
 4:  123   45    4     0
 5:  123   45    5     0
 6:  123   45    6     0
 7:  123   57    1     0
 8:  123   57    2     0
 9:  123   57    3     1
10:  123   57    4     0
11:  123   57    5     0
12:  123   57    6     1

Если вы хотите получить ожидаемый результат, который вы предоставили, вы можете сделать следующее.

setDT(foo)[, group := 1:.N][.(var1,
                              rep(var2, each = max(var3)),
                              rep(1:max(var3), times = nrow(foo)),
                              rep(group, each = max(var3))),
                             on = .(var1, var2, var3, group)][, `:=` (count = nafill(count, fill = 0),
                                                                      group = NULL)][]

    var1 var2 var3 count
 1:  123   45    1     1
 2:  123   45    2     0
 3:  123   45    3     0
 4:  123   45    4     0
 5:  123   45    5     0
 6:  123   45    6     0
 7:  123   57    1     0
 8:  123   57    2     0
 9:  123   57    3     1
10:  123   57    4     0
11:  123   57    5     0
12:  123   57    6     0
13:  123   57    1     0
14:  123   57    2     0
15:  123   57    3     0
16:  123   57    4     0
17:  123   57    5     0
18:  123   57    6     1
1 голос
/ 19 февраля 2020

Один dplyr и tidyr Возможны следующие варианты:

foo %>%
 rowid_to_column() %>%
 complete(var3 = seq(min(var3), max(var3), 1), nesting(rowid), fill = list(count = 0)) %>%
 arrange(rowid) %>%
 group_by(rowid) %>%
 fill(var1, var2, .direction = "updown") 

    var3 rowid  var1  var2 count
   <dbl> <int> <dbl> <dbl> <dbl>
 1     1     1   123    45     1
 2     2     1   123    45     0
 3     3     1   123    45     0
 4     4     1   123    45     0
 5     5     1   123    45     0
 6     6     1   123    45     0
 7     1     2   123    57     0
 8     2     2   123    57     0
 9     3     2   123    57     1
10     4     2   123    57     0
11     5     2   123    57     0
12     6     2   123    57     0
13     1     3   123    57     0
14     2     3   123    57     0
15     3     3   123    57     0
16     4     3   123    57     0
17     5     3   123    57     0
18     6     3   123    57     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...