如何找到符合条件的行数

How to find the number of rows which match a condition

如果我有一个dataframe A喜欢

A:
x.     y.     z.     a.     b.     c. 
1      0      0      3      0      0
2      0      0      5      6      5
3      0      0      6      8      2
4      0      1      8      0      6
5      0      0      20     2      0
6      0      1      3      3      7

我怎样才能获得像这样的数据框B: 3 列,每列与数据框 A 的 a、b 和 c 列相关。包含符合以下条件的行数:

a、b、c值在5和10之间的次数,(5 <= i <=10) AND z值等于1。例如:在a列中,第3行是6 即 >5 且 < 10,但 z。值不为 1 则该行不算数。另一方面,在第 4 行中,a。大于 5 且小于 10,并且 z。值为1,则算这一行。

B 会像:

B:
a.      b.      c.
1       0       2

这是使用 tidyverse 工具的解决方案。方法是使用 filter 减少到只有 z == 1 的行,然后使用 summarise_at 压缩其他行。我们首先应用函数 (. > 5 & . < 10) 为每个 a, b, c 是否在 5 和 10 之间创建一个逻辑向量,然后将其包装在 sum 中。当应用于逻辑向量时,sumTRUE 视为 1,将 FALSE 视为 0,因此这相当于计算 TRUE 值。

library(tidyverse)
tbl_A <- read_table2(
  "x     y     z     a     b     c 
  1      0      0      3      0      0
  2      0      0      5      6      5
  3      0      0      6      8      2
  4      0      1      8      0      6
  5      0      0      20     2      0
  6      0      1      3      3      7"
)
tbl_b <- tbl_A %>%
  filter(z == 1) %>%
  summarise_at(vars(a:c), ~ sum(. > 5 & . < 10)) %>%
  print()
# A tibble: 1 x 3
      a     b     c
  <int> <int> <int>
1     1     0     2

或以 R 为基数:

sapply(c("a.", "b.", "c."), function(x)
    nrow(df[(df[, x] >= 5 & df[, x] <= 10) & df[, "z."] == 1, ])
)
#a. b. c.
# 1  0  2

示例数据

df <- read.table(text =
    "x.     y.     z.     a.     b.     c.
1      0      0      3      0      0
2      0      0      5      6      5
3      0      0      6      8      2
4      0      1      8      0      6
5      0      0      20     2      0
6      0      1      3      3      7", header = T)

这是一个使用data.table

的选项
library(data.table)
setDT(df)[z. == 1, lapply(.SD, function(x) sum(x > 5 & x < 10)) , .SDcols = a.:c.]
#   a. b. c.
#1:  1  0  2