R объединить данные / расширить набор данных - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь расширить свой набор данных, используя R. Я записал наблюдения для каждой выборки и рассчитал проценты на основе этих наблюдений.Теперь мне нужно расширить каждую выборку, чтобы перечислить все возможные наблюдения без каких-либо расчетов.Пример myData: Начальный набор данных:

Sample    Observation    Percent
A         Y              50
A         N              50
B         Y              10
B         N              80
B         Don't know     10 

Требуемый набор данных:

Sample    Observation    Percent
A         Y              50
A         N              50
A         Don't know     NA
B         Y              10
B         N              80
B         Don't know     10 

Так что в этом случае мне нужно было бы расширить весь образец A, чтобы включить «Don»Не знаю "категорию" и заполните ее "NA".

Я пробовал

myTable <- table(myData)
TableFrame2 <- data.frame(myTable)

, который расширяет набор данных, но портит процентную колонку (? Почему).Я думал, что смогу объединить проценты обратно, но мне нужно сопоставить этот столбец с расширенным набором по образцу и столбцам наблюдения, чтобы получить точное совпадение.Какие-либо предложения?

1 Ответ

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

Одним из способов является объединение / объединение комбинаций обратно в данные.(Я немного изменил данные, чтобы их было легко скопировать / вставить здесь в SO.)

dat <- read.table(header=TRUE, stringsAsFactors=FALSE, text='
Sample    Observation    Percent
A         Y              50
A         N              50
B         Y              10
B         N              80
B         Don_t_know     10 ')

База R

merge(
  dat,
  expand.grid(Sample = unique(dat$Sample),
              Observation = unique(dat$Observation),
              stringsAsFactors = FALSE),
  by = c("Sample", "Observation"),
  all = TRUE
)
#   Sample Observation Percent
# 1      A  Don_t_know      NA
# 2      A           N      50
# 3      A           Y      50
# 4      B  Don_t_know      10
# 5      B           N      80
# 6      B           Y      10

Tidyverse:

library(dplyr)
library(tidyr)

dat %>%
  full_join(
    crossing(Sample = unique(dat$Sample), Observation = unique(dat$Observation)),
    by = c("Sample", "Observation")
  )
#   Sample Observation Percent
# 1      A           Y      50
# 2      A           N      50
# 3      B           Y      10
# 4      B           N      80
# 5      B  Don_t_know      10
# 6      A  Don_t_know      NA

или даже

dat %>%
  full_join(expand(., Sample, Observation))
# Joining, by = c("Sample", "Observation")
#   Sample Observation Percent
# 1      A           Y      50
# 2      A           N      50
# 3      B           Y      10
# 4      B           N      80
# 5      B  Don_t_know      10
# 6      A  Don_t_know      NA
...