【问题标题】:Get number of rows that match certain conditions and add to column in R获取符合特定条件的行数并添加到 R 中的列
【发布时间】:2018-07-09 22:42:29
【问题描述】:

所以我有以下数据表:

Name | Addr   | Age
-------------------
Bill | 2112 W | 17
Barb | 2112 W | 16
Rick | 3445 E | 16
Chad | 2112 W | 5
Ruth | 5567 S | 4
Mick | 3445 E | 17
Hank | 3445 E | 1
Lace | 1111 S | 16
Nick | 2112 W | 4

我想添加一个计算列,检查满足以下条件的行数是否大于 2:地址相同且年龄大于 15 的所有行,因此新表将是:

Name | Addr   | Age | Count
---------------------------
Bill | 2112 W | 17  | TRUE    #There are two people at addr 2112 W over 15, so True
Barb | 2112 W | 16  | TRUE    #There are two people at addr 2112 W over 15, so True
Rick | 3445 E | 16  | TRUE    #There are two people at addr 3445 E over 15, so True
Chad | 2112 W | 5   | TRUE    #There are two people at addr 2112 W over 15, so True
Ruth | 5567 S | 4   | FALSE   #No one at 5567 S is over 15, so False
Mick | 3445 E | 17  | TRUE    #There are two people at addr 3445 E over 15, so True
Hank | 3445 E | 1   | TRUE    #There are two people at addr 3445 E over 15, so True
Lace | 1111 S | 16  | FALSE   #Only one person over 15 is at addr 1111 S, so False
Nick | 5567 S | 16   | FALSE  #Two people live at addr, but only one of them is over 15 so False

这是我目前正在尝试的解决方案:

dat$COUNT 15]) >= 2, dat$ADDR)

但这似乎无法正常工作,并且在处理大型数据集时速度非常慢。

【问题讨论】:

    标签: r dataframe datatable


    【解决方案1】:

    您能否尝试关注一下,如果这对您有帮助,请告诉我。

    var$Count <- ifelse(var$Age>=15,"| TRUE","| FALSE")
    var %>% group_by(Addr)
    

    输出如下。

    * <fct> <int> <fct> <fct> <int> <chr>  
    1 |      2112 W     |        17 | TRUE 
    2 |      2112 W     |        16 | TRUE 
    3 |      3445 E     |        16 | TRUE 
    4 |      2112 W     |         5 | FALSE
    5 |      5567 S     |         4 | FALSE
    6 |      3445 E     |        17 | TRUE 
    7 |      3445 E     |         1 | FALSE
    8 |      1111 S     |        16 | TRUE 
    

    【讨论】:

    • @akrun,很抱歉在这里标记你,你能建议我如何在这里跳过标题吗?我看到标题在输出中像 Name X. Addr X..1 Age Count 一样出现,如果你能指导和编辑我的答案或者我可以编辑它,我将不胜感激,谢谢。
    • 不,当然,我了解您的问题。您是如何创建数据集的?
    • 您不需要引用的 TRUE、FALSE 和 ifelse,如果只是 var$Age&gt;=15
    • OP 帖子中的描述有点不清楚。可能你需要library(data.table);setDT(df)[, Count := .N &gt;= 2 &amp; any(Age &gt; 15), .(Addr)]
    • @akrun 你的答案就是解决方案,而且它的工作速度明显更快。谢谢!
    【解决方案2】:

    这个怎么样?

    library(tidyverse)
    df %>%
        group_by(Addr) %>%
        mutate(count = n() > 1)
    ## A tibble: 8 x 4
    ## Groups:   Addr [4]
    #  Name  Addr     Age count
    #  <fct> <fct>  <int> <lgl>
    #1 Bill  2112 W    17 TRUE
    #2 Barb  2112 W    16 TRUE
    #3 Rick  3445 E    16 TRUE
    #4 Chad  2112 W     5 TRUE
    #5 Ruth  5567 S     4 FALSE
    #6 Mick  3445 E    17 TRUE
    #7 Hank  3445 E     1 TRUE
    #8 Lace  1111 S    16 FALSE
    

    或者在基础 R 中使用 ave

    df$count <- as.logical(ave(rep(1, nrow(df)), df$Addr, FUN = function(x) sum(x) > 1))
    df
    #  Name   Addr Age count
    #1 Bill 2112 W  17  TRUE
    #2 Barb 2112 W  16  TRUE
    #3 Rick 3445 E  16  TRUE
    #4 Chad 2112 W   5  TRUE
    #5 Ruth 5567 S   4 FALSE
    #6 Mick 3445 E  17  TRUE
    #7 Hank 3445 E   1  TRUE
    #8 Lace 1111 S  16 FALSE    
    

    样本数据

    df <- read.table(text =
        "Name  Addr    Age
    Bill  '2112 W'  17
    Barb  '2112 W'  16
    Rick  '3445 E'  16
    Chad  '2112 W'  5
    Ruth  '5567 S'  4
    Mick  '3445 E'  17
    Hank  '3445 E'  1
    Lace  '1111 S'  16", header = T)
    

    更新

    随着您更新的示例数据和Age &gt; 15 的要求

    df <- read.table(text =
        "Name  Addr    Age
    Bill  '2112 W'  17
    Barb  '2112 W'  16
    Rick  '3445 E'  16
    Chad  '2112 W'  5
    Ruth  '5567 S'  4
    Mick  '3445 E'  17
    Hank  '3445 E'  1
    Lace  '1111 S'  16
    Nick  '2112 W'  4", header = T)
    
    
    df %>%
        group_by(Addr) %>%
        mutate(count = n() > 1 & Age > 15)
    ## A tibble: 9 x 4
    ## Groups:   Addr [4]
    #  Name  Addr     Age count
    #  <fct> <fct>  <int> <lgl>
    #1 Bill  2112 W    17 TRUE
    #2 Barb  2112 W    16 TRUE
    #3 Rick  3445 E    16 TRUE
    #4 Chad  2112 W     5 FALSE
    #5 Ruth  5567 S     4 FALSE
    #6 Mick  3445 E    17 TRUE
    #7 Hank  3445 E     1 FALSE
    #8 Lace  1111 S    16 FALSE
    #9 Nick  2112 W     4 FALSE
    

    【讨论】:

    • 我认为这是检查地址是否有两个或更多人,而不是地址是否有两个 15 岁以上的人。这个数据集的输出是一样的,但是如果我突然添加一行写着“Nick”、“5567 S”、“5”的行#4,那么新的行就会是真的。我将添加这一行以突出显示,因为您的答案将为该特定数据集提供正确的输出
    • @Santi 我已经更新了我的答案;请看一下。我不确定为什么 Hank 应该被标记为 TRUE,因为 `Age
    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 2020-09-15
      • 1970-01-01
      • 2011-04-27
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      • 2019-03-01
      • 1970-01-01
      相关资源
      最近更新 更多