Расширять фрейм данных в R столбцами с разными значениями идентификаторов - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть следующий фрейм данных в R

df1 <- data.frame(
    "ID" = c("A", "B", "A", "B"),
    "Value" = c(1, 2, 5, 5),
    "freq" = c(1, 3, 5, 3)
)

Я хочу получить следующий фрейм данных

     Value      freq  ID
      1           1    A
      2          NA    A 
      3          NA    A
      4          NA    A
      5          1     A
      1          NA    B
      2          2     B 
      3          NA    B
      4          NA    B
      5          5     B    

Я пробовал следующий код

library(tidyverse)
df_new <- bind_cols(df1 %>%
                        select(Value, freq, ID) %>%
                        complete(., expand(., 
                                     Value = min(df1$Value):max(df1$Value))),)

Я получаю следующий вывод

   Value  freq ID   
 <dbl> <dbl> <fct>
 1     1     A    
 2     3     B    
 3     NA    NA   
 4     NA    NA   
 5     5     A    
 5     3     B 

Я прошу кого-нибудь помочь мне.

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Использование data.table:

library(data.table)
setDT(df1) 
setkey(df1, ID, Value)

df1[CJ(ID = c("A", "B"), Value = 1:5)]

    ID Value freq
 1:  A     1    1
 2:  A     2   NA
 3:  A     3   NA
 4:  A     4   NA
 5:  A     5    5
 6:  B     1   NA
 7:  B     2    3
 8:  B     3   NA
 9:  B     4   NA
10:  B     5    3
0 голосов
/ 06 февраля 2019

Используя tidyr::full_seq, мы можем найти полную версию Value, но nesting(full_seq(Value,1) вернет ошибку:

Ошибка: by не может содержать столбец соединения full_seq(Value, 1), которыйотсутствует в RHS

, поэтому нам нужно добавить имя, следовательно nesting(Value=full_seq(Value,1)

library(tidyr)
df1 %>% complete(ID, nesting(Value=full_seq(Value,1)))

# A tibble: 10 x 3
  ID    Value  freq
  <fct> <dbl> <dbl>
  1 A        1.    1.
  2 A        2.   NA 
  3 A        3.   NA 
  4 A        4.   NA 
  5 A        5.    5.
  6 B        1.   NA 
  7 B        2.    3.
  8 B        3.   NA 
  9 B        4.   NA 
 10 B        5.    3.
0 голосов
/ 06 февраля 2019

Подойдет ли вам следующий подход?

with(data = df1,
     expr = {
         data.frame(Value = rep(wrapr::seqi(min(Value), max(Value)), length(unique(ID))),
                    ID = unique(ID))
     }) %>%
    left_join(y = df1,
              by = c("ID" = "ID", "Value" = "Value")) %>%
    arrange(ID, Value)

Результаты

   Value ID freq
1      1  A    1
2      2  A   NA
3      3  A   NA
4      4  A   NA
5      5  A    5
6      1  B   NA
7      2  B    3
8      3  B   NA
9      4  B   NA
10     5  B    3

Комментарии

  • Если я правильно следую вашему примеру, вашID группа принимает значения от 1 до 5. Если это так, мой подход заключается в том, чтобы сгенерировать это чтение уникальных комбинаций обоих из исходного фрейма данных.
  • Единственная переменнаязначение, которое переносится из исходного фрейма данных, равно freq, которое может / не может быть доступно для данного параметра ID-Value.Я бы присоединился к этой переменной через left_join (как вам кажется tidyverse)
    • В вашем примере у вас есть freq переменная со значениями 13,5 но тогда в примере вы перечисляете 1,2,5?В моем примере я взял оригинал freq и оставил присоединиться к нему.Вы можете изменить его дальше, используя обычный dplyr конвейер, если это то, что вы намеревались сделать.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...