R 基于部分列名和数学表达式过滤数据帧中的行

R 基于部分列名和数学表达式过滤数据帧中的行,r,R,我试图找到一种方法,使用列标题的部分名称和数学表达式(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

我试图找到一种方法,使用列标题的部分名称和数学表达式(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进行过滤的方法,这些值同时出现在由不同子字符串指定的两组列中

任何帮助都将不胜感激

使用:

cols <- grep('[SW]$', names(df), value = TRUE)
df[rowSums(df[, cols] > 0) == length(cols),]
这假设您只希望将以
S
W
结尾的列的所有值都保持在零以上的行

注意:
value=TRUE
可以在
grep
中省略,这将返回一个数值向量


作为对您评论的回应,如果希望将以
W
结尾的列与以
S
结尾的列分开处理,您可以执行以下操作:

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),]

我们可以使用
dplyr
包中的
filter\u
dt2
是最终输出

# 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))
#加载包
图书馆(dplyr)
#创建示例数据帧
dt 0
dt2%
过滤器位于(变量(以“S”结尾),任何变量(.>0))%>%
过滤器位于(变量(以“W”结尾)、任何变量(.>0))

可以使用函数
grep
。这是一种方法:

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
df2 <- dt[,grep(pattern="^Algae",colnames(dt)]


dt2 <- dt %>%
  filter_at(vars(ends_with("W")), any_vars(. > 0))


df2 <- data.frame(dt[,grep(pattern="Algae",colnames(dt))])


dt <- dt %>%
  filter_at(vars(ends_with("S")), any_vars(. > 0)) %>%
  filter_at(vars(ends_with("W")), any_vars(. > 0))  

dt2 <- data.frame(dt[,-grep(pattern="Algae",colnames(dt))])

无论行中的值是什么,都要将列结尾保留为“W”吗?是。我只需要在任何以W结尾的列中值>0的行&任何以S结尾的列。我明白了。我更新了我的答案,将
所有变量
替换为
任何变量
。请让我知道这是否是您想要的。在看到Jaap的答案后,我认为在
call中分离
filter\u可能是过滤数据的最佳方式。我进一步更新了我的答案。谢谢!这对所有以W结尾的列和以S结尾的列的值都大于0的行有效,但我意识到我应该更具体一些。有没有办法将值大于0的行保留在任何以W结尾的列中&任何以S结尾的列中?
# 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))
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
df2 <- dt[,grep(pattern="^Algae",colnames(dt)]


dt2 <- dt %>%
  filter_at(vars(ends_with("W")), any_vars(. > 0))


df2 <- data.frame(dt[,grep(pattern="Algae",colnames(dt))])


dt <- dt %>%
  filter_at(vars(ends_with("S")), any_vars(. > 0)) %>%
  filter_at(vars(ends_with("W")), any_vars(. > 0))  

dt2 <- data.frame(dt[,-grep(pattern="Algae",colnames(dt))])
> dt2
     OTU_ID X3_22L15_S X3_22T10_W X3_22L6_S
1 denovo147         44        484        28