【问题标题】:Extract reachable rows based on id根据 id 提取可达行
【发布时间】:2020-04-03 13:44:49
【问题描述】:

我正在尝试编写一个function,它将返回与该 ID 相关的所有行。

输入数据:

df <- data.frame(
         id1=c('A1','A1','B1','B2','C2','C3','B3','D1','D2','E1'),
         id2=c('P1','P2','P1','P2','P1','KK3','KK3','DL5','FD7','LO6')
      )

例如

sample_rows <- function(id1){

  #code here 
  return(output)
}

所需的输出 1:

sample_rows(id1='A1') 应该返回以下数据框:

  id1    id2
  A1     P1
  A1     P2
  B1     P1
  B2     P2
  C2     P1

所需输出 2:

sample_rows(id1 = 'C3') 应该返回以下数据框:

  id1    id2
  C3     KK3
  B3     KK3

【问题讨论】:

    标签: r dplyr data.table tidyverse plyr


    【解决方案1】:

    不要使用sample作为函数名,你可能会覆盖R自己的函数

    base R解决方案:

    my_fun <- function(id1) {
      id2s <- df[df$id1 == id1, 'id2']
      df[df$id2 %in% id2s,]
    }
    
    my_fun(id1 = 'A1')
    #>   id1 id2
    #> 1  A1  P1
    #> 2  A1  P2
    #> 3  B1  P1
    #> 4  B2  P2
    #> 5  C2  P1
    
    my_fun(id1 = 'C3')
    #>   id1 id2
    #> 6  C3 KK3
    #> 7  B3 KK3
    

    dplyr解决方案:

    library(dplyr)
    
    my_dplyr_fun <- function(data, id1) {
      id2s <- filter(data, id1 == {{id1}}) %>% 
        pull(id2)
      data %>%
        filter(id2 %in% id2s)
    }
    
    df %>% 
      my_dplyr_fun('C3')
    #>   id1 id2
    #> 1  C3 KK3
    #> 2  B3 KK3
    

    reprex package (v0.3.0) 于 2020 年 4 月 3 日创建

    【讨论】:

      【解决方案2】:

      利用igraphdplyr 的一种解决方案可能是:

      fun <- function(data, id1) {
       data %>%
        left_join(stack(clusters(graph.data.frame(data))$membership),
                 by = c("id2" = "ind")) %>%
       filter(values == values[id1 == !!id1])
      }
      
      fun(df, "A1")
      
        id1 id2 common_id
      1  A1  P1         1
      2  A1  P2         1
      3  B1  P1         1
      4  B2  P2         1
      5  C2  P1         1
      

      或者:

      fun <- function(data, id1) {
       clust <- clusters(graph.data.frame(data))$membership
       data %>%
        mutate(common_id = clust[match(id2, names(clust))]) %>%
        filter(common_id == common_id[id1 == !!id1])
      }
      

      【讨论】:

        猜你喜欢
        • 2021-10-18
        • 2021-11-09
        • 2017-01-22
        • 2019-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-16
        • 2015-11-20
        相关资源
        最近更新 更多