Попробуйте пакет dplyr для этого. Я делаю это, как мы надеемся, реальный код, но не запускал его, так как у меня нет фреймов данных.
По сути, мы выполняем внутреннее соединение с x и b (поэтому сохраняем только строки с совпадающими rs_ID и V4), а затем выбираем нужные столбцы.
библиотека (dplyr)
x %>%
inner_join(b, by = c("rs_id" = "V4")) %>%
select(gene_id, chr, rs_id, pvalue_G, pvalue_E, V2, V3)
Неделя 1 определяется как являющийся неделей, которая запускается в понедельник и содержит первый четверг года.
Согласно ISO 8601:1988 , который используется в Швеции , первая неделя года является первой неделей, которая имеет по крайней мере четыре дня в течение нового года.
Поэтому, если Ваша неделя запускает в понедельник первый четверг, любой год в течение первой недели. Вы можете DateAdd или DateDiff от этого.
Лично я использовал бы в своих интересах информацию о культуре для получения дня недели и цикла вниз к первому дню культуры недели. Я не уверен, объясняю ли я это правильно, вот пример:
public DateTime GetFirstDayOfWeek(int year, int weekNumber)
{
return GetFirstDayOfWeek(year, weekNumber, Application.CurrentCulture);
}
public DateTime GetFirstDayOfWeek(int year, int weekNumber,
System.Globalization.CultureInfo culture)
{
System.Globalization.Calendar calendar = culture.Calendar;
DateTime firstOfYear = new DateTime(year, 1, 1, calendar);
DateTime targetDay = calendar.AddWeeks(firstOfYear, weekNumber);
DayOfWeek firstDayOfWeek = culture.DateTimeFormat.FirstDayOfWeek;
while (targetDay.DayOfWeek != firstDayOfWeek)
{
targetDay = targetDay.AddDays(-1);
}
return targetDay;
}
Самый легкий путь состоит в том, чтобы, вероятно, найти первый понедельник года и затем добавить соответствующее число недель. Вот некоторый пример кода. Это принимает недельное число, запускающееся в 1, между прочим:
using System;
class Test
{
static void Main()
{
// Show the third Tuesday in 2009. Should be January 20th
Console.WriteLine(YearWeekDayToDateTime(2009, DayOfWeek.Tuesday, 3));
}
static DateTime YearWeekDayToDateTime(int year, DayOfWeek day, int week)
{
DateTime startOfYear = new DateTime (year, 1, 1);
// The +7 and %7 stuff is to avoid negative numbers etc.
int daysToFirstCorrectDay = (((int)day - (int)startOfYear.DayOfWeek) + 7) % 7;
return startOfYear.AddDays(7 * (week-1) + daysToFirstCorrectDay);
}
}
Мне нравится решение, предложенное Хенком Холтерманом. Но чтобы быть немного более независимым от культуры, вы должны получить первый день недели для текущей культуры (это не всегда понедельник):
using System.Globalization;
static DateTime FirstDateOfWeek(int year, int weekOfYear)
{
DateTime jan1 = new DateTime(year, 1, 1);
int daysOffset = (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek - (int)jan1.DayOfWeek;
DateTime firstMonday = jan1.AddDays(daysOffset);
int firstWeek = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(jan1, CultureInfo.CurrentCulture.DateTimeFormat.CalendarWeekRule, CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek);
if (firstWeek <= 1)
{
weekOfYear -= 1;
}
return firstMonday.AddDays(weekOfYear * 7);
}
с использованием Fluent DateTime http://fluentdatetime.codeplex.com/
var year = 2009;
var firstDayOfYear = new DateTime(year, 1, 1);
var firstMonday = firstDayOfYear.Next(DayOfWeek.Monday);
var weeksDateTime = 12.Weeks().Since(firstMonday);
Чтобы преобразовать в обоих направлениях, см. Здесь: Статья в Википедии о недельных датах ISO
Предполагая, что номер недели начинается с 1
DateTime dt = new DateTime(YearNumber, 1, 1).AddDays((WeekNumber - 1) * 7 - (WeekNumber == 1 ? 0 : 1));
return dt.AddDays(-(int)dt.DayOfWeek);
Это должно дать вам первый день в любой данной неделе. Я не проводил много тестов, но похоже, что он работает. Это меньшее решение, чем большинство других, которые я нашел в Интернете, поэтому хотел поделиться.