如何找到符合条件的行数
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
中。当应用于逻辑向量时,sum
将 TRUE
视为 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
如果我有一个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
中。当应用于逻辑向量时,sum
将 TRUE
视为 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