有没有办法在data.frame中从具有相似后缀的不同列中选择行?

时间:2017-05-15 13:45:50

标签: r

我在R中有一个数据框如下

PROBE_ID    H_1AVG_Signal   H_1Detection Pval   H_2AVG_Signal   H_2Detection Pval   GH_1AVG_Signal  GH_1Detection Pval
ILMN_1343291    47631.78    0.00            53022.43    0.00            46567.29    0.00
ILMN_1651229    135.42      0.01            161.59      0.01            162.46      0.04
ILMN_1651260    80.81       0.86            88.05       0.86            92.45       0.89
ILMN_1651279    143.65      0.01            138.96      0.04            113.29      0.47

是否有任何可能的方法来对包含具有检测p值的探针ID的数据进行子集化<使用通用后缀"检测Pval"最终获得如下的子集数据

PROBE_ID    H_1AVG_Signal   H_1Detection Pval   H_2AVG_Signal   H_2Detection Pval   GH_1AVG_Signal  GH_1Detection Pval
ILMN_1343291    47631.78    0.00            53022.43    0.00            46567.29    0.00
ILMN_1651229    135.42      0.01            161.59      0.01            162.46      0.04

我真的很感激如何创建这样一个子集的建议。 谢谢。

2 个答案:

答案 0 :(得分:1)

如果你总是知道你将拥有的列名,那么你可以使用dplyr过滤器来获得你想要的结果

library(dplyr)

main.df <- main.df %>%
           filter(`H_1Detection Pval` < 0.05 | `H_2Detection Pval` < 0.05 | `GH_1Detection Pval` < 0.05)

如果您不总是知道列名,可以动态获取它们并将它们插入dplyr filter_命令,如下所示

library(dplyr)
# Find any columns that contain "detection" in the column name
det.cols <- colnames(main.df)[which(grepl("detection",tolower(colnames(main.df))))]

# Create a filter string from the column names in the format of
# "`column name` < 0.05 | `column name2` < 0.05"
filt <- gsub(","," | ",toString(paste("`",det.cols,"`"," < 0.05", sep = "")))

# Apply the filter to the dataframe
main.df <- main.df %>%
           filter_(filt)

答案 1 :(得分:0)

filter_at是一种动态检测列的简便方法,如R dplyr filtering data with values greater than +N and lesser than -N : abs() function?

中所述

main.df %>% filter_at(vars(contains("Detection Pval")), .vars_predicate = any_vars(. < 0.5))