2015-12-10 2 views
1

У меня есть dataframe следующим образом называются DFфильтр строк в одном dataframe на основе столбцов в другом dataframe в г

OC_ID   Bcode Bcode_full Cell Ploidy Goodness_of_fit 
OC_DD_0181  LP2000 LP2000-A 56  3  0.45 
OC_AD_9787  LP2003 LP2003-B 3  3  0.44 
OC_GH_6227  LP2333 LP2333-S 66  3  0.89 

У меня есть другой dataframe следующего названия df2:

chr leftPos Tumour2_OCLLL_DD_0181_SLH.9396.fq.gz Tumour2_OCLLL_DD_09787_SLH.9396.fq.gz Tumour3_OCLLL_GH_6227_SLH.9396.fq.gz  Tumour4_OCLLL_GH_6632_SLH.9396.fq.gz Tumour5_OCLLL_WH_6992_SLH.9396.fq.gz 
chr1 720916 13.4031903 28.4522464 10.34087 23.4309208 16.239874 
chr1 736092 3.4367155 36.7797331 6.893913 58.5773021 59.546204 
chr1 818159 108.9438802 109.6452421 78.131014 90.2779596 108.265825 
chr1 4105086 114.4426249 103.7466057 59.747246 48.9292758 129.91899 
chr1 4140849 23.7133367 0.6939572 45.95942 53.0641442 37.893039 

Название столбец в df2 точно не соответствует имени строки OC_ID в df. Я хочу, чтобы создать dataframe, который содержит только те столбцы из df2, где значение в столбце Cell в df1 составляет> 30, так что ожидаемый выход

chr leftPos OC_DD_0181 OC_GH_6227 
chr1 720916 13.4031903 10.34087 
chr1 736092 3.4367155 6.893913 
chr1 818159 108.9438802 78.131014 
chr1 4105086 114.4426249 59.747246 
chr1 4140849 23.7133367 45.95942 

ответ

4

Мы получаем соответствующий «OC_ID» для значений «клетка» более 30 ('нм1'). Затем используйте gsub, чтобы удалить подстроку, которая не требуется от имен столбцов 'df2', grep с «nm1», чтобы получить индекс столбца, и извлечь эти столбцы из «df2».

nm1 <- df$OC_ID[df$Cell>30] 
nm2 <- gsub('.*(OC).*_([A-Z]{2}_\\d+).*', '\\1_\\2', names(df2)) 
df2N <- df2[c(1:2,grep(paste(nm1, collapse='|'), nm2))] 
names(df2N)[3:4] <- nm2 
2

Просто отправьте мой медленный (и на данный момент нерелевантный) ответ за полноту. Ответ akrun (который я сохранил) выглядит более элегантным, хотя в его использовании регулярных выражений.

namevector <- as.character(df$OC_ID[df$Cell > 30]) 
grepnames <- paste(namevector, collapse="|") 
indices <- grep(pattern=grepnames, names(df2)) 
df3 <- df2[,c(1,2,indices)] 
df3 #output df that you requested 

Таким образом, векторный характер создается из OC_IDs вы хотите от ДФА и сложены в массивную строку Grep шаблон. Индексы совпадающих столбцов находятся в df2. Df3 создается с двумя первыми столбцами и любыми соответствующими столбцами.

Смежные вопросы