Как распространить два столбца данных с созданием уникального идентификатора? - PullRequest
1 голос
/ 27 марта 2020

Попытка распространить данные двух столбцов в формат, в котором будут некоторые значения NA.

фрейм данных:

df <- data.frame(Names = c("TXT","LSL","TXT","TXT","TXT","USL","LSL"), Values = c("apple",-2,"orange","banana","pear",10,-1),stringsAsFactors = F)

enter image description here

Если строка включает TXT, следующие строки, имеющие LSL или USL, будут принадлежать этой строке.

Например:

  • в первом ряду; Имя TXT Значение apple Следующая строка LSL Значение будет для яблока LSL, а с USL это будет NA до следующего TXT имени.

  • Если за TXT следует еще один TXT, тогда значения LSL и USL для этой строки будут NA

пытается создать это:

enter image description here

Я пытался использовать спред с номерами строк в качестве уникального идентификатора, но это не то, что мне нужно:

df %>% group_by(Names) %>% mutate(row = row_number()) %>% spread(key = Names,value = Values)

Я думаю, мне нужно создать следующую полную таблицу с NA, затем распределить, но не могу понять, как.

enter image description here

Ответы [ 2 ]

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

Мы можем расширить набор данных на complete после создания индекса группировки на основе вхождения 'TXT'

library(dplyr)
library(tidyr)
df %>% 
     group_by(grp = cumsum(Names == 'TXT')) %>%
     complete(Names = unique(.$Names)) %>%
     ungroup %>% 
     spread(Names, Values) %>%
     select(TXT, LSL, USL)
# A tibble: 4 x 3
#  TXT    LSL   USL  
#  <chr>  <chr> <chr>
#1 apple  -2    <NA> 
#2 orange <NA>  <NA> 
#3 banana <NA>  <NA> 
#4 pear   -1    10   
0 голосов
/ 27 марта 2020

В data.table мы можем использовать dcast:

library(data.table)

dcast(setDT(df), cumsum(Names == 'TXT')~Names, value.var = 'Values')[, -1]

#    LSL    TXT  USL
#1:   -2  apple <NA>
#2: <NA> orange <NA>
#3: <NA> banana <NA>
#4:   -1   pear   10
...