2017-06-28 21 views
2

我试图找到一种使用列标题的部分名称和数学表达式(x> 0)来过滤行的方法。鉴于我的数据在这里:根据部分列名和数学表达式过滤数据框中的行

OTU_ID  X3_22L15_S X3_22T10_W X3_22L6_S X3_22Algae 
1 denovo109  16   0   9   0 
2 denovo147  44   484   28   0 
3 denovo297  0   0   7   14 
4 denovo1013  0   1   0   0 

我想只包括那些在与列在“S”结尾,在“W”结尾的标题和列的值> 0的行。我已经找到了根据列标题的子字符串和基于特定列中的值进行筛选的方法来过滤列的方法,但是没有找到任何允许我基于> 0的过滤器进行过滤,这两个过程同时发生在两组由不同的子字符串指定的列。

任何帮助,将不胜感激!

+0

无论列中的值是什么,您是否想保留“W”列结束? – www

+0

是的。我只需要在W和以S. –

+0

结尾的任何列结尾的任何列中值> 0的行。我通过将'all_vars'替换为'any_vars'来更新我的答案。请让我知道,如果这是你想要的。 – www

回答

2

使用:

cols <- grep('[SW]$', names(df), value = TRUE) 
df[rowSums(df[, cols] > 0) == length(cols),] 

给出:

 OTU_ID X3_22L15_S X3_22T10_W X3_22L6_S X3_22Algae 
2 denovo147   44  484  28   0 

这是假设你只希望保留具有高于零上SW结束列中的所有值的行。

注:value = TRUE可以grep被省略,那么这将给数字矢量回


在respons您的意见,如果想治疗的列上WS结束列单独的结束你可以这样做:

wcols <- grep('W$', names(df), value = TRUE) 
scols <- grep('S$', names(df), value = TRUE) 

df[rowSums(df[, wcols, drop = FALSE] > 0) & rowSums(df[, scols, drop = FALSE] > 0),] 

这给:

 OTU_ID X3_22L15_S X3_22T10_W X3_22L6_S X3_22Algae 
2 denovo147   44  484  28   0 
+0

谢谢!对于所有以W结尾的所有列和以S结尾的所有列,这对于值> 0的行有效,但我意识到我应该更具体。 有没有一种方法可以让任何以W结尾的列和任何以S结尾的列中值> 0的行保留? –

+0

@EmilyDodd查看更新,HTH – Jaap

+0

这个工程!非常感谢! –

3

我们可以使用dplyr包中的filter_atdt2是最终输出。

# Load package 
library(dplyr) 

# Create example data frame 
dt <- read.table(text = " OTU_ID  X3_22L15_S X3_22T10_W X3_22L6_S X3_22Algae 
1 denovo109  16   0   9   0 
       2 denovo147  44   484   28   0 
       3 denovo297  0   0   7   14 
       4 denovo1013  0   1   0   0", 
       header = TRUE, stringsAsFactors = FALSE) 

# Filter the data, with any column ends with "S" or "W" and values > 0 
dt2 <- dt %>% 
    filter_at(vars(ends_with("S")), any_vars(. > 0)) %>% 
    filter_at(vars(ends_with("W")), any_vars(. > 0)) 
相关问题