子集为向量的不同部分设置不同标准的向量

时间:2016-01-28 17:46:52

标签: r

给定一个向量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) 永远不会正常工作。

1 个答案:

答案 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