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

时间:2018-06-12 16:02:20

标签: 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
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

......还有更多行!

我想获得的值只有几个预定义列的值> gt = = 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,并且不仅在预定义列上。

我的colums数量减少,因此可以手动预定义列索引(或名称)以供进一步选择,但是,我无法弄清楚如何处理以选择显示超过特定阈值的值的行,同时还添加约束在这些价值可能出现的列上。

欢迎任何建议!

干杯:)

3 个答案:

答案 0 :(得分:2)

一种选择是在所选列上使用dplyr::filter_at

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的目的是检查所有选定列的条件,则可以在上面的代码中将any_vars替换为all_vars

数据:

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)

答案 1 :(得分:1)

不完全确定你想要什么,但我想你想要这个:

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()

这会产生:45

答案 2 :(得分:0)

非常感谢,Adam和MKR。

我应该提到我不想选择S.A和S.B列都显示&gt;的列。 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()

我只需要添加额外条件,其中S.A应该全部> = 0.05但是S.B <0.05。 0.05,然后相反的情况。我不知道如何对tidyverse做同样的事情,但MKR提供的建议肯定会对进一步的讯问或其他人有用!

非常感谢!