如何查找符合条件

时间:2018-02-12 22:39:42

标签: r if-statement dataframe conditional

如果我有一个类似

的数据框
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

3 个答案:

答案 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