【问题标题】:R tidyverse manipulating dataframeR tidyverse 操作数据框
【发布时间】:2020-07-24 18:37:23
【问题描述】:

数据:

name_id     name_desc   is_mand   count
howard101   howards id        1   123
howard101   howards id        0     4
rando12     random pers       1   500
peter54     peters name       1    10
peter54     peters name       0    14
danny66     dannys acc        0    20

我有如上所示的数据,name_id 可以是强制性的 (1) 或不是 (0)。如果 name_id 有一个强制性和非强制性的列,我想对计数求和并将其标记为强制性 (is_mand = 1)。 我该怎么做?

预期输出:

name_id     name_desc   is_mand   count
howard101   howards id        1   127
rando12     random pers       1   500
peter54     peters name       1    24
danny66     dannys acc        0    20

我有如图所示的数据

我想我可以按 name_id 分组,当计数大于 2 时,只需将其标记为必填并求和?

【问题讨论】:

  • is_mand 的值全为 0 时是否求和?例如,如果 danny66 有另一行 is_mand 为 0 且计数为 50,您是否希望 danny66 为 70?

标签: r tidyverse


【解决方案1】:

您是否尝试根据每个 name_id 的强制和非强制值来汇总计数?

如果是这样,您将使用汇总函数:

df_summary <- df %>% group_by(name_id, name_description, is_mand) %>% summarise(count = sum(name_id, na.rm = TRUE)

或者,如果您只想按 is_mand 过滤,您可以使用:

df_filtered <- df[df$is_mand == 1,]

您还可以将这两个操作与过滤功能结合起来:

df_summary &lt;- df %&gt;% group_by(name_id, name_description, is_mand) %&gt;% summarise(count = sum(name_id, na.rm = TRUE) %&gt;% filter(is_mand == 1)

这大致是您要求的吗?

【讨论】:

    【解决方案2】:

    这是通过来自dplyr:group_by()summarise() 完成的

    df %>%
      group_by(name_id, name_desc) %>%
      summarise(is_mand = sum(is_mand),
                count = sum(count))
    
      name_id   name_desc   is_mand count
      <chr>     <chr>         <dbl> <dbl>
    1 danny66   dannys acc        0    20
    2 howard101 howards id        1   127
    3 peter54   peters name       1    24
    4 rando12   random pers       1   500
    

    【讨论】:

      【解决方案3】:

      另一个选项使用ifelse() 语句匹配name_id,其中任何is_mand 等于1。

      df %>%
        group_by(name_id, name_desc) %>%
        summarize(is_mand = ifelse(any(is_mand == 1), 1, 0),
                  count = ifelse(any(is_mand == 1), sum(count), count))
      

      数据

      df <- structure(list(name_id = c("howard101", "howard101", "rando12", 
      "peter54", "peter54", "danny66"), name_desc = c("howards id", 
      "howards id", "random pers", "peters name", "peters name", "dannys acc"
      ), is_mand = c(1, 0, 1, 1, 0, 0), count = c(123, 4, 500, 10, 
      14, 20)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", 
      "data.frame"))
      

      【讨论】:

        猜你喜欢
        • 2019-10-31
        • 2021-06-28
        • 2021-06-28
        • 2015-09-19
        • 1970-01-01
        • 2021-06-26
        • 1970-01-01
        • 2015-06-26
        • 2020-11-20
        相关资源
        最近更新 更多