【问题标题】:Identify the groups sharing a duplicated value识别共享重复值的组
【发布时间】:2021-01-15 19:35:27
【问题描述】:

我有一个数据框,总结了由序列号标识的不同设备的部署历史。随着时间的推移,设备 (serno) 可以被不同的项目使用,但在任何给定时间只能部署在一个项目上。我生成了一个名为used.elsewhere 的新列,用于标识该行中的 serno 是否在 df 中重复。例如:

project = c("a","b","c","c","c","d","e")
serno = c(1,2,2,2,3,3,3)
deployed = c(T,T,F,F,F,F,T)
used.elsewhere = c(F,T,T,T,T,T,T)
data.frame(project,serno,deployed,used.elsewhere)

  project serno deployed used.elsewhere
1       a     1     TRUE          FALSE
2       b     2     TRUE           TRUE
3       c     2    FALSE           TRUE
4       c     2    FALSE           TRUE
5       c     3    FALSE           TRUE
6       d     3    FALSE           TRUE
7       e     3     TRUE           TRUE

我想生成一个新列,如果没有部署 serno 值并在其他地方使用,则指示部署 serno 的项目:

project = c("a","b","c","c","c","d","e")
serno = c(1,2,2,2,3,3,3)
deployed = c(T,T,F,F,F,F,T)
used.elsewhere = c(F,T,T,T,T,T,T)
other.project = c(NA, NA, "b", "b", "e", "e", NA)

  project serno deployed used.elsewhere other.project
1       a     1     TRUE          FALSE          <NA>
2       b     2     TRUE           TRUE          <NA>
3       c     2    FALSE           TRUE             b
4       c     2    FALSE           TRUE             b
5       c     3    FALSE           TRUE             e
6       d     3    FALSE           TRUE             e
7       e     3     TRUE           TRUE          <NA>

我假设我可以使用如下的ifelse 语句,但我不确定如何完成它。

df %>%
  mutate(other.project = ifelse(deployed == F & used.elsewhere == T, ...

提前谢谢你!

【问题讨论】:

    标签: r if-statement dplyr


    【解决方案1】:

    如果您首先group_by(serno),则可以在同一组中包含project,其中deployed 为TRUE。

    library(dplyr)
    
    df %>%
      group_by(serno) %>%
      mutate(other.project = ifelse(
        deployed == FALSE & used.elsewhere == TRUE,
        project[deployed],
        NA
      ))
    

    输出

      project serno deployed used.elsewhere other.project
      <chr>   <dbl> <lgl>    <lgl>          <chr>        
    1 a           1 TRUE     FALSE          NA           
    2 b           2 TRUE     TRUE           NA           
    3 c           2 FALSE    TRUE           b            
    4 c           2 FALSE    TRUE           b            
    5 c           3 FALSE    TRUE           e            
    6 d           3 FALSE    TRUE           e            
    7 e           3 TRUE     TRUE           NA 
    

    【讨论】:

      【解决方案2】:

      我建议构建一个部署映射,然后将其与您的 df 结合起来:

      library(dplyr)
      deployments <- df %>% 
        filter(deployed == TRUE) %>% 
        select(serno, other.project = project)
      
      df %>% 
        left_join(deployments)
      

      然后您只需要确保在您想要它们的 other.project 列中有 NA(即,通过重新编码 where other.project == project)。

      【讨论】:

        猜你喜欢
        • 2019-07-20
        • 1970-01-01
        • 2015-01-23
        • 2021-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多