Как посчитать вхождения последовательностей значений во фрейм данных? - PullRequest
0 голосов
/ 05 июля 2018

У меня есть фрейм данных со столбцом значений (процедуры, назначенные случайным образом) 1, 2, 3. Что-то вроде:

i,treatment
1,1
2,3
3,2
4,2
5,1
6,3
7,3
8,2
9,1
...

Каждый блок из 3 строк в кадре данных содержит перестановку трех доступных значений, например, для строк 1-3 выше (1,3,2), для строк 4-6 (2,1,3), для строк 7-9 (3,2,1) и т. д. Количество строк во фрейме данных делится на 3.

Мне нужно посчитать случаи перестановок - как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

A dplyr решение на основе count может быть как:

library(dplyr)

# Group of every 3 rows
df %>% group_by(grp = (row_number()-1)%/%3) %>%
  #use paste with argument 'collapse' to find distinct permutations. 
  summarise(Permutation = paste(treatment, collapse=",")) %>%
  count(Permutation)

# # A tibble: 3 x 2
#   Permutation     n
#   <chr>       <int>
# 1 1,3,2           1
# 2 2,1,3           1
# 3 3,2,1           1

Данные:

df <- read.table(text=
"i,treatment
1,1
2,3
3,2
4,2
5,1
6,3
7,3
8,2
9,1",
header = TRUE, sep=",")
0 голосов
/ 05 июля 2018

В дальнейшем treatment - это столбец в вашем фрейме данных (длина которого кратна 3). Просто используя данные вашего примера, есть treatment <- c(1, 3, 2, 2, 1, 3, 3, 2, 1). Тогда

M <- matrix(treatment, ncol = 3, byrow = TRUE)
radix <- 10 ^ (2:0)
ID <- M %*% radix
table(ID)

#132 213 321 
#  1   1   1 

Возможно, более доступной версией является использование paste0 для генерации ID для индекса перестановки: ID <- apply(M, 1L, paste0, collapse = ""), но это будет гораздо менее эффективно, чем умножение матрицы на вектор, которое я использовал выше для очень длинного treatment вектор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...