r - 在 R 中,我可以过滤至少有 1 个值满足阈值的所有列吗

标签 r dplyr

您好,这是我的第一篇文章(不确定我是要在此处发布还是在 github 上发布)。我对这一切都很陌生。

我想保留至少一个值高于我设置的截止值(本例中为 2)的行。我在我的例子中已经实现了这一点(分子 d 被删除),但我想有更好的方法,特别是如果我有很多样本。 有没有办法选择除第一列之外的所有列并应用于表格的其余部分?

我正在尝试通过删除所有样本中含量较低的内容来清理数据。 我认为通过删除所有值都低于 2 的行可以获得相同的结果?

> marker = c('a','b','c','d','e')
> sample1 = c(100,55,43,1.5,89)
> sample2 = c(98,45,22,1,0.5)
> sample3 = c(89,45,65,0.5,67)
> data = data.frame( 'Molecule' = marker, 'sam1' = sample1, 'sam2'= sample2, 'sam3' = sample3)
> data
  Molecule  sam1 sam2 sam3
1        a 100.0 98.0 89.0
2        b  55.0 45.0 45.0
3        c  43.0 22.0 65.0
4        d   1.5  1.0  0.5
5        e  89.0  0.5 67.0

> limit = 2
> data %>% filter(.[2] >limit | .[3] > limit | .[4] > limit)
  Molecule sam1 sam2 sam3
1        a  100 98.0   89
2        b   55 45.0   45
3        c   43 22.0   65
4        e   89  0.5   67

谢谢

最佳答案

使用filter_at,可以做到这一点。在新版本的dplyr中,有across,但它会查找all而不是any(|)。指定感兴趣的列,如果列名模式都是 starts_with 'sam',则循环遍历这些列,将逻辑表达式包装在 any_vars

library(dplyr)
data %>% 
  filter_at(vars(starts_with('sam')),  any_vars(. > limit))

-输出

#    Molecule sam1 sam2 sam3
#1        a  100 98.0   89
#2        b   55 45.0   45
#3        c   43 22.0   65
#4        e   89  0.5   67

或者使用base R中的rowSums创建一个逻辑向量

data[rowSums(data[startsWith(names(data), 'sam')] > limit) > 0,]

关于r - 在 R 中,我可以过滤至少有 1 个值满足阈值的所有列吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65483056/

相关文章:

r - 如何为曲线包络着色

r - sapply on data.frame vs vector (colnames, rownames)

r - 在 R 中查找汇总列的相对频率

r - 如果满足条件,则复制前一行

r - 如何取消 R 中测试产生的数据帧的嵌套

R:当电子邮件有多个域名后缀时,如何将电子邮件拆分为多个部分?

R - 问题 : Mutate doesn't create a new column

r - 有效地广播具有多个变量的大型数据集

r - 获得R上的花键表面

r - 在 R 中将字符串转换为序列