如果我有一个类似
的数据框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)并且z值等于1.例如:在a栏中,第3行是6>&lt; 5&lt; 5&lt; 5&gt; 10,但是z。值不是1然后该行不计数。另一方面,在第4行,a。是> 5且&lt; 10,和z。 value为1,然后计算此行。
B就像:
B:
a. b. c.
1 0 2
答案 0 :(得分:3)
以下是使用tidyverse
工具的解决方案。方法是使用z == 1
仅减少filter
行,然后使用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
答案 1 :(得分: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)
答案 2 :(得分:2)
以下是使用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