如何通过从具有给定字符串的列中删除所有行并且值小于X来对数据帧进行子集化?

时间:2018-03-06 22:21:56

标签: r subset

我正在尝试在R中对数据框进行子集...我想删除所有列中值为> 0的所有行,其中包含“空白”一词。

Ex输入)df

ID OTU1 OTU2 Blank1 Blank2 1 5 0 0 2 2 3 3 0 0 3 0 9 5 0 4 2 0 0 0

期望的输出

ID OTU1 OTU2 Blank1 Blank2 2 3 3 0 0 4 2 0 0 0

我可以通过专栏单独执行此操作 df2=subset(df, subset=!(Blank1>0 | Blank2>0))

我想更改此设置,以便搜索其中包含“空白”字样的所有列,然后删除这些列中的值大于0的行。

我正在尝试df2=subset(df, subset=!((grepl("Blank",colnames(df)))>0)),但它无法正常工作。

3 个答案:

答案 0 :(得分:0)

下次考虑使用dput来提供可重现的示例。鉴于此,此代码应该可以工作(但我没有测试它):

df <- df[rowSums(df[, grepl("Blank", colnames(df))]) > 0, ]

编辑:这与所要求的完全相反。你走了:

df[rowSums(df[, grepl("Blank", colnames(df))]) == 0, ]

答案 1 :(得分:0)

这也应该有效:

df[!(apply(df[,c("Blank1","Blank2")] > 0,1,sum) > 0),]

答案 2 :(得分:0)

使用grepl函数我将使用以下代码:

df2 <- df[apply(df[,grepl("Blank",names(df))],1,sum)==0,]

要打破这个......

apply通过行或列应用函数,1参数告诉它执行行。通过应用sum如果有任何零,我会得到非零的东西。如果负值可能会将sum更改为function(x){sum(abs(x))},而是会在求和之前获取单元格的绝对值。

一旦我应用了sum函数,我只需检查以获取0的值:)

我们将所有内容包装到'df'的row参数中,我们只返回那些我们想要的行。

祝你好运!