给定一个向量class BaseSerializer(serializers.ModelSerializer):
class Meta:
abstract = True
class SurveySerializer(BaseSerializer):
included_serializers = {
'landing_page': 'api.serializers.LandingPageSerializer',
'trigger': 'api.serializers.TriggerSerializer',
'template': 'api.serializers.TemplateSerializer'
}
questions = serializers.ReadOnlyField(source='question_data')
class Meta:
model = Survey
fields = ('id',
'name',
'slug',
'template',
'landing_page',
'trigger',
'trigger_active',
'start_date',
'end_date',
'description',
'fatigue_limit',
'url',
'questions',)
meta_fields = ('created_at', 'modified_at')
,我想对向量进行子集化,以删除任何不小于某个阈值sub
的{{1}}个元素,并删除任何剩余的元素不大于某个阈值bp
的元素。此问题的示例数据可能如下所示:
x
我已经为数据集的前半部分尝试了以下代码:
y
这是下半场:
sub <- c(0.05588, 0.05588, 0.05588, 0.05588, 0.05588, 0.05588, 0.05588,
0.05588, 0.0625856, 0.0625856, 0.0625856, 0.0625856, 0.0625856,
0.0692912, 0.0692912, 0.0692912, 0.0692912, 0.0692912, 0.0692912,
0.0692912)
bp <- 10
x <- 0.06
y <- 0.07
这是一个漫长的过程,在后面的代码中sub[sub>=x][1:bp] <- NA
new <- na.omit(sub)
永远不会正常工作。
答案 0 :(得分:3)
根据我的理解,您要删除数据的第一个x
元素的某个阈值bp
以上的所有元素,并删除低于某个阈值y
的所有元素元件。
让我们考虑一组完整的问题数据:
set.seed(144)
(sub <- rnorm(10))
# [1] -1.6505562 0.6028106 -0.4738839 -1.7976130 -1.4211210 0.1588875 0.1297662 -1.2561688
# [9] 0.1476671 0.9791739
bp <- 5
x <- 0
y <- 0.13
现在我们可以在基数为R的1-liner中执行操作,删除0以上的前5个元素的子集以及0.13以下的其余元素的子集:
sub[!c(head(sub >= x, bp), tail(sub <= y, -bp))]
# [1] -1.6505562 -0.4738839 -1.7976130 -1.4211210 0.1588875 0.1476671 0.9791739
在此代码中,head(sub >= x, bp)
返回指示符,表明每个首先bp
元素是否至少为x
或更高,然后tail(sub <= y, -bp)
返回指标是否其余每个元素(-bp
表示&#34;除第一个bp
&#34;之外的所有元素都是y
或更小。然后,我们将这两个指标向量组合在一起,并使用它们删除sub
中指标设置为TRUE
的任何元素。
如果你只是想要指示是否应该从向量中删除每个元素,你可以通过以下方式获得:
c(head(sub >= x, bp), tail(sub <= y, -bp))
# [1] FALSE TRUE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE