【问题标题】:Add a flag that meet certain conditions in a data frame在数据框中添加满足某些条件的标志
【发布时间】:2017-08-23 06:01:25
【问题描述】:

对于每个受试者,如果 Cmax 或 AUC 为零,则 FLAG 应为 0。如果两者均为 1,则 FLAG=1。

SUB    METRIC    BE    FLAG
 1      Cmax     0       NA
 1      AUC      1       NA
 2      Cmax     1       NA
 2      AUC      1       NA
 3      Cmax     1       NA
 3      AUC      1       NA
 4      Cmax     1       NA
 4      AUC      0       NA

输出应该是这样的:

SUB    METRIC    BE     FLAG
 1      Cmax     0       0
 1      AUC      1       0
 2      Cmax     1       1
 2      AUC      1       1
 3      Cmax     1       1
 3      AUC      1       1
 4      Cmax     1       0
 4      AUC      0       0

然后我想取 FLAG 的总和,但唯一主题的 FLAG=1 应该添加一次,因为它是同一个主题。所以,上面 FLAG 的总和应该等于 2 而不是 4。我使用的是 RStudio。

【问题讨论】:

  • 如果每个SUB 只有两行,那么我们可以使用base R:as.numeric(ave(df$BE, df$SUB, FUN= sum) == 2) 并直接获得答案的另一部分sum(aggregate(BE~SUB, df, sum)[2] == 2)

标签: r dplyr plyr


【解决方案1】:

我们可以在按'SUB'分组后使用逻辑条件

library(dplyr)
df1 %>%
  group_by(SUB) %>% 
  mutate(FLAG = as.integer(all(BE[METRIC %in% c("Cmax", "AUC")]==1)))
# A tibble: 8 x 4
# Groups:   SUB [4]
#    SUB METRIC    BE  FLAG
#  <int>  <chr> <int> <int>
#1     1   Cmax     0     0
#2     1    AUC     1     0
#3     2   Cmax     1     1
#4     2    AUC     1     1
#5     3   Cmax     1     1
#6     3    AUC     1     1
#7     4   Cmax     1     0
#8     4    AUC     0     0

【讨论】:

    【解决方案2】:

    我认为 akruns 的回答更优雅,但这是我使用 dplyrs case_when() 的方法:

    dat %>% 
      group_by(SUB) %>% 
      mutate(
        FLAG = case_when(
          sum(BE) < length(BE)  ~ 0,
          sum(BE) == length(BE) ~ 1
        ))
    # A tibble: 8 x 4
    # Groups:   SUB [4]
    #    SUB METRIC    BE  FLAG
    #  <dbl>  <chr> <dbl> <dbl>
    #1     1   Cmax     0     0
    #2     1    AUC     1     0
    #3     2   Cmax     1     1
    #4     2    AUC     1     1
    #5     3   Cmax     1     1
    #6     3    AUC     1     1
    #7     4   Cmax     1     0
    #8     4    AUC     0     0
    

    然后您可以使用summarise() 函数取FLAG 的最大值,并将SUB_FLAG 相加。那么SUB_FLAG 的和就是 2。

    dat %>% 
      group_by(SUB) %>% 
      mutate(
        FLAG = case_when(
          sum(BE) < length(BE)  ~ 0,
          sum(BE) == length(BE) ~ 1
          )
      ) %>%
      summarise(SUB_FLAG = max(FLAG)) %>% 
      summarise_at("SUB_FLAG", sum)
    # A tibble: 1 x 1
    #  SUB_FLAG
    #      <dbl>
    #1        2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-10
      • 2021-10-13
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 2020-12-06
      • 2022-10-24
      • 1970-01-01
      相关资源
      最近更新 更多