Вставка строк на основе двух факторных уровней в R - PullRequest
0 голосов
/ 13 октября 2018

У меня есть фрейм данных (df) с четырьмя переменными, из которых две являются множителями, var1 и var2.у var1 и var2 есть три уровня.

Некоторые комбинации var1 и var2 отсутствуют в кадре данных, например, отсутствует уровень var2 "4 или 5" для уровня var1 "slow".

Я хотел бы добавить эти недостающие строки комбинаций в мой фрейм данных (dfgoal) и установить для var3 и var4 этих строк значение 0.

Я считаю, что добавлять строки сложно в лучшем случаераз, и понятия не имею, как этого добиться.Любая помощь приветствуется!

# Starting point 
df <- data.frame(var1=c("fast","fast","fast","medium","slow","slow"),
                 var2=c("1 or 2","3","4 or 5","3","1 or 2","3"),
                 var3_freq=c(22,56,22,100,36,64),
                 var4_n=c(10,26,10,2,5,9))
df$var1 <- as.factor(df$var1)
df$var2 <- as.factor(df$var2)

# Goal
dfgoal <- data.frame(var1=c("1 or 2","3","4 or 5","1 or 2","3","4 or 5","1 or 2","3","4 or 5"),
                 var2=c("fast","fast","fast","medium","medium","medium","slow","slow","slow"),
                 var3_freq=c(22,56,22,0,100,0,36,64,0),
                 var4_n=c(10,26,10,0,2,0,5,9,0))

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Простое решение без загрузки внешних библиотек:

    var1   var2 var3_freq var4_n
1   fast 1 or 2        22     10
2   fast      3        56     26
3   fast 4 or 5        22     10
4 medium      3       100      2
5   slow 1 or 2        36      5
6   slow      3        64      9
7 medium 1 or 2         0      0
8 medium 4 or 5         0      0
9   slow 4 or 5         0      0

Код

new <- data.frame(var1 = c("medium", "medium", "slow"),
                  var2 = c("1 or 2", "4 or 5", "4 or 5"),
                  var3_freq = c(0, 0, 0),
                  var4_n = c(0, 0, 0))
rbind(df, new)

Данные

df <- data.frame(var1=c("fast","fast","fast","medium","slow","slow"),
                 var2=c("1 or 2","3","4 or 5","3","1 or 2","3"),
                 var3_freq=c(22,56,22,100,36,64),
                 var4_n=c(10,26,10,2,5,9))
df$var1 <- as.factor(df$var1)
df$var2 <- as.factor(df$var2)    
0 голосов
/ 13 октября 2018

Вы можете использовать complete() из tidyr:

library(tidyr)
complete(df, var2, var1, fill = list(var3_freq = 0, var4_n = 0))

  var2   var1   var3_freq var4_n
  <fct>  <fct>      <dbl>  <dbl>
1 1 or 2 fast          22     10
2 1 or 2 medium         0      0
3 1 or 2 slow          36      5
4 3      fast          56     26
5 3      medium       100      2
6 3      slow          64      9
7 4 or 5 fast          22     10
8 4 or 5 medium         0      0
9 4 or 5 slow           0      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...