Создать пустые пропущенные строки для значений в многогрупповых многоуровневых структурах данных и вычислить разницу между строками в группах - PullRequest
1 голос
/ 10 января 2020

Допустим, у меня есть следующий набор данных:

ID  Type  Group      Week    Value
111 A      Pepper     -1      10
112 B      Salt        2      20
113 C      Curry       4      40
114 D      Rosemary    9      90
211 A      Pepper     -1      15
212 B      Salt        2      30
214 D      Rosemary    9      135

Где ID, тип и группа, а также неделя вводятся в измерительный прибор, измеряющий «значение» каждую неделю. Иногда есть несколько результатов в неделю, поэтому первоначальная проверка заключалась в том, чтобы создать среднее для каждого еженедельного измерения.

Я бы хотел

a) создать набор данных, в котором строки автоматически вставляются, если в столбце Week есть пустые строки, поэтому он выглядит следующим образом - всегда с порядком типа A, B, C, D и групповой порядок Перец, Соль, Карри, Розмарин и Неделя -1, 2, 4, 9.

ID  Type  Group      Week    Value
111 A      Pepper     -1      10
112 B      Salt        2      20
113 C      Curry       4      40
114 D      Rosemary    9      90
211 A      Pepper     -1      15
212 B      Salt        2      30
213 C      Curry       4      60
214 D      Rosemary    9      135

b) Цель состоит в том, чтобы рассчитать разницу между измеренными значениями в вертикальной плоскости только для каждой группы ie:

ID  Type  Group      Week    Value  Diff
111 A      Pepper     -1      10     NA
112 B      Salt        2      20     10
113 C      Curry       4      40     20 
114 D      Rosemary    9      90     50
211 A      Pepper     -1      15     NA
212 B      Salt        2      30     15
213 C      Curry       4      60     30
214 D      Rosemary    9      135    75

Я могу видеть, как это сделать в для l oop, но должен быть более элегантный способ?

1 Ответ

0 голосов
/ 11 января 2020

Я не уверен, что это будет полезно, но подумал, что это может быть начало.

Если у вас есть повторяющиеся группы строк, я мог бы создать общий c фрейм данных и повторить его несколько раз , затем присоединитесь к вашему доступному набору данных. Это эффективно вставит пропущенные строки.

Кроме того, если вы используете tidyverse, вы можете вычислить diff, используя lag.

Обратите внимание, что это не даст точно такой же результат, так как я не был уверен, откуда взялся 60 для Curry (отредактирую ответ позже).

library(tidyverse)

# Define number of repeating groups
N = 2

# Create generic group of Type, Group, Week
df <- data.frame(
  Type = c("A", "B", "C", "D"),
  Group = c("Pepper", "Salt", "Curry", "Rosemary"),
  Week = c(-1, 2, 4, 9)
)

# Represents the number of rows
nrow_df <- nrow(df)

# Repeat groups of rows N times
full_df <- df[rep(seq_len(nrow_df), times = N), ]

# Add ID numbers
full_df$ID <- rep(seq(110, (100 * N) + 10, by=100), each=nrow_df) + seq(1:nrow_df)

# Second data frame with missing rows
df2 <- read.table(text =
"ID  Type  Group      Week    Value
111 A      Pepper     -1      10
112 B      Salt        2      20
113 C      Curry       4      40
114 D      Rosemary    9      90
211 A      Pepper     -1      15
212 B      Salt        2      30
214 D      Rosemary    9      135", header = T, stringsAsFactors = T)

# Join the data frames and get differences
full_df %>%
  left_join(df2) %>%
  group_by(grp = ceiling(row_number()/nrow_df)) %>%
  mutate(Diff = Value - lag(Value))

# A tibble: 8 x 7
# Groups:   grp [2]
  Type  Group     Week    ID Value   grp  Diff
  <fct> <fct>    <dbl> <dbl> <int> <dbl> <int>
1 A     Pepper      -1   111    10     1    NA
2 B     Salt         2   112    20     1    10
3 C     Curry        4   113    40     1    20
4 D     Rosemary     9   114    90     1    50
5 A     Pepper      -1   211    15     2    NA
6 B     Salt         2   212    30     2    15
7 C     Curry        4   213    NA     2    NA
8 D     Rosemary     9   214   135     2    NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...