我有一个动态数据框,其外观类似于以下内容;
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
数据框将刷新,并且数据可以按任何顺序显示,并且字母和位置可以任意组合。还有以下变量;
sequence
,在此示例中,其值为“ BC”。starting_position
,在此示例中,其值为“ 2”。我想使用基数R提取所有唯一标识符,这些标识符在位置[starting_position]
处带有“ B”,在下一个相邻位置即[starting_position+1]
上具有“ C”。
变量可以是任意长度,例如用户可以改为输入“ ABC”,“ B”或“ CD”,并且查询必须进行相应的更新。
请注意,我使用的软件不允许我在服务器上安装其他软件包,因此解决方案应仅在 Base R 中。
答案 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
这是它的工作方式:
filter
删除starting_value
之前的行,group_by
标识符,以便dplyr一起作用于具有相同标识符的行arrange
按位置排列,以正确的顺序放置它们,而不考虑数据帧的顺序summarize
每组产生一列,其中包含Letter
粘贴到字符串中。由于过滤步骤的原因,starting_value
之前的字母被删除了mutate
添加了一个新变量,该变量说明字符串(由连接的Letter
组成)是否startsWith
和sequence
。Identifier
的行中选择变量has_string == TRUE
。您可以通过unname(unlist())
传递输出,使其成为简单的向量。我注意到在评论中,您提到您只能使用基数R。显然,此答案对您而言不起作用,但我将在这里留给其他人使用。