У меня есть таблица с двумя столбцами идентификаторов w
и x
. Столбцы y
вносят порядок в столбец z
, который является целевой переменной. Каждая последовательность, обозначенная w
и x
, имеет как минимум две строки и все различные значения в z
. Я хочу посчитать для каждого из z
s, как часто они встречаются в последовательностях, в которых позиция. По позиции меня интересует, первый это, последний или какой-либо другой. Мой подход в R dplyr
заключается в следующем (для тех, кто не знаком с %>%
, это оператор канала, который берет вывод левой руки и помещает его в качестве первого аргумента в функцию правой руки, вы можете прочитать его как «и затем» ):
library(tidyverse)
library(reticulate)
data <- tribble(
~w, ~x, ~y, ~z,
1, 1, 1, "a",
1, 1, 2, "b",
1, 2, 1, "b",
1, 2, 2, "a",
1, 2, 3, "c",
1, 2, 4, "d",
2, 1, 1, "b",
2, 1, 2, "a",
2, 1, 3, "c",
2, 1, 4, "d"
)
Сначала я добавляю индекс последовательности к каждой упорядоченной группе w
и x
и маркер, определяющий категориальную позицию z
в последовательности из нее (position_in_sequence
).
data_with_markers <-
data %>%
group_by(w, x) %>%
arrange(y, .by_group = TRUE) %>%
mutate(
sequence_id = row_number(),
position_in_sequence = case_when(
sequence_id == first(sequence_id) ~ "first",
sequence_id == last(sequence_id) ~ "last",
TRUE ~ "other" # this is the "else"
)
) %>%
ungroup()
>data_with_markers
# A tibble: 10 x 6
w x y z sequence_id position_in_sequence
<dbl> <dbl> <dbl> <chr> <int> <chr>
1 1 1 1 a 1 first
2 1 1 2 b 2 last
3 1 2 1 b 1 first
4 1 2 2 a 2 other
5 1 2 3 c 3 other
6 1 2 4 d 4 last
7 2 1 1 b 1 first
8 2 1 2 a 2 other
9 2 1 3 c 3 other
10 2 1 4 d 4 last
Затем я делаю простой подсчет по position_in_sequence
и z
.
data_summary <- data_with_markers %>%
group_by(position_in_sequence, z) %>%
count() %>%
ungroup()
> data_summary
# A tibble: 6 x 3
position_in_sequence z n
<chr> <chr> <int>
1 first a 1
2 first b 2
3 last b 1
4 last d 2
5 other a 2
6 other c 2
Для pandas я застрял с получением position_in_sequence
переменная (я использую пакет reticulate
здесь):
import pandas as pd
data = r.data
data
w x y z
0 1.0 1.0 1.0 a
1 1.0 1.0 2.0 b
2 1.0 2.0 1.0 b
3 1.0 2.0 2.0 a
4 1.0 2.0 3.0 c
5 1.0 2.0 4.0 d
6 2.0 1.0 1.0 b
7 2.0 1.0 2.0 a
8 2.0 1.0 3.0 c
9 2.0 1.0 4.0 d
data_sorted = data.sort_values(['w', 'x', 'y'])
data_sorted['sequence_id'] = data_sorted.groupby(['w', 'x']).cumcount() + 1
data_sorted
w x y z sequence_id
0 1.0 1.0 1.0 a 1
1 1.0 1.0 2.0 b 2
2 1.0 2.0 1.0 b 1
3 1.0 2.0 2.0 a 2
4 1.0 2.0 3.0 c 3
5 1.0 2.0 4.0 d 4
6 2.0 1.0 1.0 b 1
7 2.0 1.0 2.0 a 2
8 2.0 1.0 3.0 c 3
9 2.0 1.0 4.0 d 4
Я возился с .apply
, но мне нужно было бы получить доступ к столбцу sequence_id
в определенной строке и минимуме столбца и Макс одновременно для сравнения, но я не получил его на работу.