R 如何获取值高于阈值的行数+;列索引约束?

R 如何获取值高于阈值的行数+;列索引约束?,r,dataframe,R,Dataframe,我有以下R数据帧: S.A1 S.A2 S.A3 S.B1 S.B2 S.B3 Loc1 0.3809 0.4444 0.5000 0.0011 0.0110 0.0003 Loc2 0.1762 0.2500 0.3333 0.5000 0.3250 0.2333 Loc3 0.2147 0.3500 0.2500 0.1428 0.2142 0.3000 Loc4 0.2382 0.4010 0.2222 0.3000 0.3095 0.3667 Lo

我有以下R数据帧:

      S.A1   S.A2   S.A3   S.B1   S.B2   S.B3
Loc1  0.3809 0.4444 0.5000 0.0011 0.0110 0.0003
Loc2  0.1762 0.2500 0.3333 0.5000 0.3250 0.2333
Loc3  0.2147 0.3500 0.2500 0.1428 0.2142 0.3000
Loc4  0.2382 0.4010 0.2222 0.3000 0.3095 0.3667
Loc5  0.0001 0.0120 0.0035 0.3333 0.4523 0.3333
Loc6  0.0095 0.0400 0.0490 0.1000 0.2321 0.1000
。。。还有更多的排

我希望仅在几个预定义的列上获取值>=0.05的行数

例如:

  • 有多少行仅在S.A1、S.A2和S.A3列上显示值>=0.05? 答案是统一:这是Loc1
  • 相反,有多少行仅在S.B1、S.B2和S.B3列上显示值>=0.05?答案是两个:分别是Loc5和Loc6
列类型S.A和S.B是互斥的,因此永远不会选择Loc2、Loc3和Loc4,因为这些值在所有位置都显示>=0.05,而不仅仅是在预定义的列上

我减少了列的数量,因此可以手动预定义列索引(或名称)以供进一步选择,但是,我不知道如何处理以选择显示高于某个阈值的值的行,同时在列上添加一个约束,使这些值可以出现在其中

欢迎任何建议


干杯:)

不太清楚你想要什么,但我想你想要这个:

library(dplyr)
df = data.frame(S.A1 = runif(6), 
                S.A2 = runif(6), 
                S.A3 = runif(6), 
                S.B1 = runif(6), 
                S.B2 = runif(6),
                S.B3 = runif(6))
因为您没有提供可复制的示例,我冒昧地制作了df。这看起来像:

     S.A1      S.A2       S.A3       S.B1      S.B2       S.B3
1 0.7050447 0.3425170 0.24222797 0.89027284 0.6516980 0.12141078
2 0.5982959 0.9922373 0.87056458 0.43965606 0.6688127 0.05517046
3 0.9416712 0.5065097 0.01904794 0.08972336 0.6339239 0.63476302
4 0.8578870 0.7158088 0.28133235 0.02191547 0.6814373 0.50473500
5 0.5962874 0.8617246 0.04189701 0.59269613 0.6201409 0.32715440
6 0.1642811 0.2287726 0.76770094 0.22238414 0.9873463 0.06580177
然后我们选择有问题的列,并说所有这些列都需要大于或等于某个截止值(在本例中为0.05),然后得到行数

df %>% select(S.A1,S.A2, S.A3) %>% filter(S.A1 >= .05 & S.A2 >= 0.05 & S.A3 >= 0.05) %>% nrow()
df %>% select(S.B1,S.B2, S.B3) %>% filter(S.B1 >= .05 & S.B2 >= 0.05 & S.B3 >= 0.05) %>% nrow()

这将产生:
4
5

一个选项是在选定列上使用
dplyr::filter\u,如下所示:

library(tidyverse)

df %>% rownames_to_column() %>%
  filter_at(vars(starts_with("S.A")), any_vars(. >= 0.50))
#   rowname   S.A1   S.A2 S.A3   S.B1  S.B2  S.B3
# 1    Loc1 0.3809 0.4444  0.5 0.0011 0.011 3e-04

df %>% rownames_to_column() %>%
  filter_at(vars(starts_with("S.B")), any_vars(. >= 0.050))
#   rowname   S.A1  S.A2   S.A3   S.B1   S.B2   S.B3
# 1    Loc2 0.1762 0.250 0.3333 0.5000 0.3250 0.2333
# 2    Loc3 0.2147 0.350 0.2500 0.1428 0.2142 0.3000
# 3    Loc4 0.2382 0.401 0.2222 0.3000 0.3095 0.3667
# 4    Loc5 0.0001 0.012 0.0035 0.3333 0.4523 0.3333
# 5    Loc6 0.0095 0.040 0.0490 0.1000 0.2321 0.1000
注意:如果OP的目的是检查所有选定列上的条件,则一次可以将上述代码中的
任何变量
替换为
所有变量

数据:

df <- read.table(text = 
"S.A1   S.A2   S.A3   S.B1   S.B2   S.B3
Loc1  0.3809 0.4444 0.5000 0.0011 0.0110 0.0003
Loc2  0.1762 0.2500 0.3333 0.5000 0.3250 0.2333
Loc3  0.2147 0.3500 0.2500 0.1428 0.2142 0.3000
Loc4  0.2382 0.4010 0.2222 0.3000 0.3095 0.3667
Loc5  0.0001 0.0120 0.0035 0.3333 0.4523 0.3333
Loc6  0.0095 0.0400 0.0490 0.1000 0.2321 0.1000",
header = TRUE, stringsAsFactors = FALSE)

非常感谢你们,亚当和MKR

我应该提到,我不希望选择S.A和S.B列都显示>0.05值的列,因为S.A和S.B是互斥的(至少我希望选择这种情况下的行)。但是,使用您建议的函数很容易实现

例如,使用
dplyr

df %>% select(S.A1,S.A2, S.A3, S.B1, S.B2, S.B3) %>% filter(S.A1 >= 0.05 & S.A2 >= 0.05 & S.A3 >= 0.05 & S.B1 < 0.05 & S.B2 < 0.05 & S.B3 < 0.05) %>% nrow()
df %>% select(S.A1,S.A2, S.A3, S.B1, S.B2, S.B3) %>% filter(S.B1 >= 0.05 & S.B2 >= 0.05 & S.B3 >= 0.05 & S.A1 < 0.05 & S.A2 < 0.05 & S.A3 < 0.05) %>% nrow()
df%%>%选择(S.A1、S.A2、S.A3、S.B1、S.B2、S.B3)%%>%过滤器(S.A1>=0.05和S.A2>=0.05和S.A3>=0.05和S.B1<0.05和S.B2<0.05和S.B3<0.05)%%>%nrow()
df%%>%选择(S.A1、S.A2、S.A3、S.B1、S.B2、S.B3)%%>%过滤器(S.B1>=0.05和S.B2>=0.05和S.B3>=0.05和S.A1<0.05和S.A2<0.05和S.A3<0.05)%%>%nrow()
我只需要添加额外的条件,其中S.A应该全部>=0.05,但S.B<0.05,然后是相反的情况。我不知道如何使用
tidyverse
做同样的事情,但MKR提供的建议肯定会对进一步的审讯或其他人有用


多谢各位

当查看S.A1、S.A2和S.A3Hi Adam时,我对Loc2、Loc3和Loc4如何不显示所有>=0.05的值感到困惑,我真的需要只计算在给定列类型上显示值>0.05的行,并且S.a和S.B是互斥的(我应该用这些术语提及这一点,如果可能,我将编辑我的原始帖子)。在这种情况下,Loc 2、3和4永远不会被计算为所有显示值均大于0.05,而不仅仅是在S.A(或S.B)列上。下面的答案提供了大量的资源!