Преобразование столбцов одного и того же кадра данных в один - PullRequest
0 голосов
/ 07 июня 2019

У меня df выглядит так:

Department   ID   Category   Category.ID
    NA       NA      NA          NA
   Sales     101     2           4
   Sales     101     2           4
    NA       NA      NA          NA
   Sales     101     2           4
   Sales     101     2           4
    NA       NA      NA          NA
   Sales     101     2           4
   Sales     101     2           4

df = data.frame(Department = rep(c(NA, 'Sales', 'Sales'), times = 3),
                ID = rep(c(NA, 101, 101), times = 3),
                Category.Department = rep(c(NA, 2, 2), times = 3),
                Category.ID = rep(c(NA, 4, 4), times = 3), stringsAsFactors = FALSE)

И я хотел бы иметь такой вывод, где только в одном столбце я могу иметь Department и ID, а в другом - Category. NA в каждом столбце важно разделять группы.

New.Col   Category
  NA         NA
 Sales       2
  101        4
  NA         NA
 Sales       2
  101        4
  NA         NA
 Sales       2
  101        4

До сих пор я пытался с transpose, sapply и function, но это не сработало, как я ожидал. Любые предложения в base?

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Невозможно принять подтверждение без ожидаемого результата.


df$group <- rep(1:3, times = 3)

df2 <- reshape(df[df$group != 3,], direction = "long", varying = list(New.col = c(1,2), Category = c(3,4)),
               idvar = "id", v.names = c("New.col", "Category"))

df3 <- df2[order(df2$id),]

df3[!(df3$time == 1 & df3$group == 1), c(3,4)] 

    New.col Category
1.2    <NA>       NA
2.1   Sales        2
2.2     101        4
3.2    <NA>       NA
4.1   Sales        2
4.2     101        4
5.2    <NA>       NA
6.1   Sales        2
6.2     101        4

0 голосов
/ 07 июня 2019

Здесь другой подход, чем приведение к длинному формату, который опирается на coalesce.Кроме того, я создал групповую переменную и удалил строки NA, поскольку они не будут служить цели в вашем анализе, то есть

library(tidyverse)

df %>% 
 group_by(grp = cumsum(rowSums(is.na(.)) == ncol(.))) %>% 
 mutate_at(vars(contains('ID')), funs(lag)) %>% 
 mutate_at(vars(contains('Department')), funs(lead)) %>% 
 mutate(new.col = coalesce(Department, as.character(ID)), 
        category = coalesce(Category.Department, Category.ID)) %>% 
 select(grp, new.col, category) %>% 
 distinct()

, что дает

# A tibble: 6 x 3
# Groups:   grp [3]
    grp new.col category
  <int> <chr>      <dbl>
1     1 Sales          2
2     1 101            4
3     2 Sales          2
4     2 101            4
5     3 Sales          2
6     3 101            4
...