Я отвечаю на вопрос: Как получить значение переменной, учитывая ее имя в строке? , которая закрыта как дубликат со ссылкой на этот вопрос.
Если рассматриваемые переменные являются частью объекта (например, части класса), то некоторые полезные функции для достижения именно этого: 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>
Если число уникальных личностей должно быть> = 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
Это решение использует purrr::accumulate
вместо цикла. (На самом деле, accumulate2
, так как есть два условия, необходимые для решения, когда переключаться на новую группу: индивидуальные идентификаторы и начало генного индикатора.) 03-23 пакетом представ (v0.2.1) sup>