Если вы хотите играть, а не использовать хорошее решение , вы можете немного поиграть с интроспекцией python:
import settings
from django.db import models
for app in settings.INSTALLED_APPS:
models_name = app + ".models"
try:
models_module = __import__(models_name, fromlist=["models"])
attributes = dir(models_module)
for attr in attributes:
try:
attrib = models_module.__getattribute__(attr)
if issubclass(attrib, models.Model) and attrib.__module__== models_name:
print "%s.%s" % (models_name, attr)
except TypeError, e:
pass
except ImportError, e:
pass
Примечание: это довольно грубая штука кода; он предположит, что все модели определены в «models.py» и что они наследуются от django.db.models.Model.
Это можно сделать с помощью Map
, чтобы получить последовательность индексов из столбцов «x», поднастроить столбец «value» для «y», основываясь на этом, получить mean
и создать значение «mean.value». 'column in' x '
x['mean.value'] <- sapply(do.call(Map, c(f = `:`, x)), function(x) mean(y$value[x]))
#
# start end mean.value
#1 1 2 0.3188163
#2 3 4 0.7405306
Его также можно упростить как
x['mean.value'] <- mapply(function(i, j) mean(y$value[i:j]), x$start, x$end)
Аналогичным вариантом с tidyverse
будет использование map2
(из purrr
)
library(tidyverse)
x %>%
mutate(mean.value = map2_dbl(start, end, ~ mean(y$value[.x:.y])))
Другим способом, используя sapply
, циклически перебирая каждую строку в x
, мы подбираем соответствующие строки из y
и берем mean
из них.
x$mean_value <- sapply(seq_len(nrow(x)), function(i) mean(y[unlist(x[i,]),]))
x
# start end mean_value
#1 1 2 0.3188163
#2 3 4 0.7405306