首页 > 解决方案 > 如何使用 if 条件检查多个值

问题描述

我喜欢下面提到的数据框:

记录:

ID        Remarks         Value
1         ABC             10
1         AAB             12
1         ZZX             15
2         XYZ             12
2         ABB             14

通过利用上述数据框,我想Status在现有数据框中添加新列。

如果Remarks是 ABC、AAB 或 ABB,则状态将是TRUE,对于 XYZ 和 ZZX,它应该是FALSE

我正在使用下面提到的方法,但它没有用。

Records$Status<-ifelse(Records$Remarks %in% ("ABC","AAB","ABB"),"TRUE",
                             ifelse(Records$Remarks %in% 
                      ("XYZ","ZZX"),"FALSE"))

并且,基于Status我想得出以下输出:

ID     TRUE    FALSE    Sum
1       2       1        37
2       1       1        26

标签: rdplyr

解决方案


Records$Status<-ifelse(Records$Remarks %in% c("ABC","AAB","ABB"),TRUE,
                        ifelse(Records$Remarks %in% 
                                   c("XYZ","ZZX"),FALSE, NA))

您需要用 括住您的字符串列表c(),并为第二个 ifelse 添加一个“else”条件(但请参阅下面的 Roman 的回答以了解使用 执行此操作的更好方法case_when)。(另请注意,这里我将"TRUE"and "FALSE"(作为字符类)更改为TRUEand FALSE(逻辑类)。

对于摘要(使用dplyr):

Records %>% group_by(ID) %>% 
dplyr::summarise(trues=sum(Status), falses=sum(!Status), sum=sum(Value))

# A tibble: 2 x 4
     ID trues falses   sum
  <int> <int>  <int> <int>
1     1     2      1    37
2     2     1      1    26

当然,如果你不是真的需要中间状态列而只需要汇总表,你可以完全跳过第一步:

Records %>% group_by(ID) %>% 
dplyr::summarise(trues=sum(Remarks %in% c("ABC","AAB","ABB")), 
  falses=sum(Remarks %in% c("XYZ","ZZX")), 
  sum=sum(Value))

推荐阅读