添加满足数据框中某些条件的标志

时间:2017-08-23 06:01:26

标签: r dplyr plyr

对于每个受试者,如果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。

2 个答案:

答案 0 :(得分:3)

我们可以在按照' 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

答案 1 :(得分: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