Сброс скользящей суммы на основе условий с использованием dplyr

Я отвечаю на вопрос: Как получить значение переменной, учитывая ее имя в строке? , которая закрыта как дубликат со ссылкой на этот вопрос.

Если рассматриваемые переменные являются частью объекта (например, части класса), то некоторые полезные функции для достижения именно этого: hasattr, getattr и setattr.

Так, например, вы можете иметь:

class Variables(object):
    def __init__(self):
        self.foo = "initial_variable"
    def create_new_var(self,name,value):
        setattr(self,name,value)
    def get_var(self,name):
        if hasattr(self,name):
            return getattr(self,name)
        else:
            raise("Class does not have a variable named: "+name)

Тогда вы можете сделать:

v = Variables()
v.get_var("foo")

"initial_variable"

v.create_new_var(v.foo,"is actually not initial")
v.initial_variable

"на самом деле не является начальным"

blockquote>

1
задан stats134711 24 March 2019 в 17:58
поделиться

2 ответа

Если число уникальных личностей должно быть> = 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
0
ответ дан Alexis 24 March 2019 в 17:58
поделиться

Это решение использует purrr::accumulate вместо цикла. (На самом деле, accumulate2, так как есть два условия, необходимые для решения, когда переключаться на новую группу: индивидуальные идентификаторы и начало генного индикатора.) 03-23 ​​пакетом представ (v0.2.1)

0
ответ дан dipetkov 24 March 2019 в 17:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: