使用基数R查询相邻行

时间:2018-07-31 18:15:42

标签: r

我有一个动态数据框,其外观类似于以下内容;

Identifier  Letter  Position
       001       A         1
       001       B         2
       001       C         3
       001       D         4
       002       A         1
       002       B         2
       002       C         3
       003       B         1
       004       C         1
       004       D         2
       005       A         1

数据框将刷新,并且数据可以按任何顺序显示,并且字母和位置可以任意组合。还有以下变量;

  1. sequence,在此示例中,其值为“ BC”。
  2. starting_position,在此示例中,其值为“ 2”。

我想使用基数R提取所有唯一标识符,这些标识符在位置[starting_position]处带有“ B”,在下一个相邻位置即[starting_position+1]上具有“ C”。

变量可以是任意长度,例如用户可以改为输入“ ABC”,“ B”或“ CD”,并且查询必须进行相应的更新。

请注意,我使用的软件不允许我在服务器上安装其他软件包,因此解决方案应仅在 Base R 中。

2 个答案:

答案 0 :(得分:0)

一种方法是首先生成要匹配的字符串,移至查询位置,然后使用DI进行匹配。

尽管如此,数据仍必须按位置排序,所以类似的事情可能会起作用:

static void Main(string[] args)
{
     IServiceCollection serviceCollection = new ServiceCollection();
     ConfigureServices(serviceCollection);

     var configuration = new JobHostConfiguration();
     configuration.Queues.MaxPollingInterval = TimeSpan.FromSeconds(1); // REMOVE
     configuration.Queues.BatchSize = 1; // REMOVE
     configuration.JobActivator = new CustomJobActivator(serviceCollection.BuildServiceProvider());
     configuration.UseTimers();

     var host = new JobHost(configuration);
     host.RunAndBlock(); // REMOVE
}

private static void ConfigureServices(IServiceCollection services)
{
    var configuration = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .Build();

    // Resolve repositories
    services.AddTransient<IMyRepository, MyRepository>();

    // Create instances of clients
    services.AddSingleton(new MyCustomClient(configuration));

    // Azure connection strings for the WebJob
    Environment.SetEnvironmentVariable("AzureWebJobsDashboard", configuration.GetConnectionString("WebJobsDashboard"));
    Environment.SetEnvironmentVariable("AzureWebJobsStorage", configuration.GetConnectionString("WebJobsStorage"));
}

reprex package(v0.2.0)于2018-07-31创建。

答案 1 :(得分:0)

这是一个tidyverse解决方案:

library(tidyverse)
sequence <- "BC"
starting <- 2

df2 <- df %>%
    filter(Position >= starting)%>%
    group_by(Identifier) %>%
    arrange(Position) %>%
    summarise(string = paste(Letter, collapse = "")) %>%
    mutate(has_string = startsWith(string, sequence))

df2
# A tibble: 3 x 3
  Identifier string has_string
       <int> <chr>  <lgl>     
1          1 BCD    TRUE      
2          2 BC     TRUE      
3          4 D      FALSE     

df2[df2$has_string, "Identifier"]
# A tibble: 2 x 1
  Identifier
       <int>
1          1
2          2

unname(unlist(df2[df2$has_string, "Identifier"]))
[1] 1 2

df2 %>%
    filter(has_string) %>%
    select(Identifier) %>% unlist() %>% unname()
[1] 1 2

这是它的工作方式:

  1. filter删除starting_value之前的行,
  2. group_by标识符,以便dplyr一起作用于具有相同标识符的行
  3. arrange按位置排列,以正确的顺序放置它们,而不考虑数据帧的顺序
  4. summarize每组产生一列,其中包含Letter粘贴到字符串中。由于过滤步骤的原因,starting_value之前的字母被删除了
  5. mutate添加了一个新变量,该变量说明字符串(由连接的Letter组成)是否startsWithsequence
  6. 现在,我们可以使用基数R括号表示法,从Identifier的行中选择变量has_string == TRUE。您可以通过unname(unlist())传递输出,使其成为简单的向量。

我注意到在评论中,您提到您只能使用基数R。显然,此答案对您而言不起作用,但我将在这里留给其他人使用。