Если число уникальных личностей должно быть> = 30 независимо от порядка, то я думаю, что это должно сработать:
library(magrittr)
compute_counts <- function(ID, gene_ends) {
ids <- as.integer(ID)
seen_ids <- numeric()
count <- 0L
adjust_count <- function(id, gene_end) {
if (!(id %in% seen_ids)) {
seen_ids <<- sort(c(seen_ids, id)) # sort strictly not needed
count <<- count + 1L
}
if (gene_end && length(seen_ids) >= 30L) {
count <- count # copy enclosed value locally
seen_ids <<- numeric()
count <<- 0L
}
count
}
unlist(Map(adjust_count, ids, gene_ends))
}
out <- df %>%
mutate(num_unique = compute_counts(ID, lastObsFlagG & lastObsFlagGE),
group = cumsum(c(-1L, diff(num_unique)) < 0L)) %T>%
View
Эта версия (с учетом исходного поста) основана на ответе Дипеткова , он использует вспомогательную функцию с замыканием, которая обновляет вложенный adjustment
, когда ген заканчивается и условия count
выполнены.
library(magrittr)
compute_counts <- function(ID, gene_ends) {
rle <- rle(as.integer(ID))
ids <- unlist(Map(rep, 1L:length(rle$values), each = rle$lengths))
adjustment <- 0L
adjust_count <- function(id, gene_end) {
count <- id - adjustment
if (gene_end && count >= 30L) {
adjustment <<- id
}
count
}
unlist(Map(adjust_count, ids, gene_ends))
}
out <- df %>%
mutate(count = compute_counts(ID, lastObsFlagG & lastObsFlagGE),
group = cumsum(count == 1L)) %T>%
View
MTOM является просто оптимизированным форматом кодирования сообщения. Это обозначает Механизм Оптимизации Передачи сообщений и передает как байты вместо угловых скобок (иначе XML). Вот основное введение в использование MTOM с WCF.
Эта небольшая выборка должна запустить Вас, если Вы хотите использовать потоковую передачу, которая является хорошей опцией, если Вы хотите передать большие файлы.