【问题标题】:How to find the number of rows which match a condition如何查找符合条件的行数
【发布时间】:2018-07-23 05:27:39
【问题描述】:

如果我有一个像 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 5 且 5 且

B 会是这样的:

B:
a.      b.      c.
1       0       2

【问题讨论】:

    标签: r if-statement dataframe conditional


    【解决方案1】:

    这是使用tidyverse 工具的解决方案。方法是使用filter 减少只有具有z == 1 的行,然后使用summarise_at 压缩其他行。我们首先应用函数(. > 5 & . < 10),它为每个a, b, c 是否在5 和10 之间生成一个逻辑向量,然后将其包装在sum 中。当应用于逻辑向量时,sumTRUE 视为1FALSE 视为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
    

    【讨论】:

    • 感谢您的帮助,Calum。我有一个问题,如果我想找到两列匹配相同条件的行数,我该怎么办?输出可能只是行数。在该示例中,可能类似于为 z=1 查找列 a 和 b 在 5-10 之间的行数,这将是 0。但是如果我们查找 z=1,则列 a 和列的行数c 在 5-10 之间,那就是 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)
    

    【讨论】:

    • 感谢您的帮助 Maurits。我有一个问题,如果我想找到两列匹配相同条件的行数,我该怎么办?输出可能只是行数。在该示例中,可能就像为 z=1 查找列 a 和 b 在 5-10 之间的行数,这将是 0。但是如果我们查找 z=1,则列 a 和列的行数c 在 5-10 之间,那就是 1。
    • @PhilippeCorner 我添加了一个简短的基本 R 解决方案来回答您的新问题。请看一下。您可以通过勾选最能回答您的问题的解决方案来结束问题。
    【解决方案3】:

    这是一个使用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
    

    【讨论】:

    • 感谢您的帮助 akrun。我有一个问题,如果我想找到两列匹配相同条件的行数,我该怎么办?输出可能只是行数。在该示例中,可能类似于为 z=1 查找列 a 和 b 在 5-10 之间的行数,这将是 0。但是如果我们查找 z=1,则列 a 和列的行数c 在 5-10 之间,那就是 1。
    • @PhilippeCorner 我没有收到你的评论。您能否更新您的问题或作为新问题发布。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 2019-12-09
    • 2014-08-12
    • 2022-11-30
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    相关资源
    最近更新 更多