R 如何筛选列表列的元素

R 如何筛选列表列的元素,r,list,filter,purrr,R,List,Filter,Purrr,我有一个包含3个变量的数据帧(df): ID(第一个ID变量) ID2(第二个id变量) 使用tidyr::nest()函数创建的数据(列表)列 library(tidyverse) library(lubridate) dates <- ymd(c('2018-02-01', '2018-02-06', '2018-02-10', '2018-02-21', '2018-04-05')) df.1 <- tibble(ID = paste0('I

我有一个包含3个变量的数据帧(df):

  • ID(第一个ID变量)
  • ID2(第二个id变量)
  • 使用tidyr::nest()函数创建的数据(列表)列

    library(tidyverse)
    library(lubridate)
    
    dates <- ymd(c('2018-02-01', '2018-02-06', '2018-02-10', 
                   '2018-02-21', '2018-04-05'))
    df.1 <- tibble(ID = paste0('ID_', rep(1, 5)),
               ID2 = LETTERS[1:5],
               DATE = dates) %>%
               group_by(ID) %>% 
               nest()
    
    
     df.2 <- tibble(ID = paste0('ID_', rep(1, 6)),
               ID2 = LETTERS[1:6])
    
    
     df <- df.1 %>%
     left_join(df.2, by = 'ID')
    
    库(tidyverse)
    图书馆(lubridate)
    日期%
    nest()
    
    df.2我们可以使用
    map2
    。我们将列表列(
    data
    )作为
    .x
    参数,将
    df$ID2
    作为
    .y
    参数,并对每个
    .x
    中的
    .x$ID2!=.y
    进行过滤:

    library(tidyverse)
    
    output <- df %>%
      mutate(data = data %>% map2(ID2, ~ filter(.x, ID2 != .y))) 
    
    库(tidyverse)
    产量%
    变异(data=data%>%map2(ID2,~filter(.x,ID2!=.y)))
    
    输出:

    > output
    # A tibble: 6 x 3
      ID    data             ID2  
      <chr> <list>           <chr>
    1 ID_1  <tibble [4 x 2]> A    
    2 ID_1  <tibble [4 x 2]> B    
    3 ID_1  <tibble [4 x 2]> C    
    4 ID_1  <tibble [4 x 2]> D    
    5 ID_1  <tibble [4 x 2]> E    
    6 ID_1  <tibble [5 x 2]> F  
    
    > output %>%
    +   pull(data)
    [[1]]
    # A tibble: 4 x 2
      ID2   DATE      
      <chr> <date>    
    1 B     2018-02-06
    2 C     2018-02-10
    3 D     2018-02-21
    4 E     2018-04-05
    
    [[2]]
    # A tibble: 4 x 2
      ID2   DATE      
      <chr> <date>    
    1 A     2018-02-01
    2 C     2018-02-10
    3 D     2018-02-21
    4 E     2018-04-05
    
    [[3]]
    # A tibble: 4 x 2
      ID2   DATE      
      <chr> <date>    
    1 A     2018-02-01
    2 B     2018-02-06
    3 D     2018-02-21
    4 E     2018-04-05
    
    [[4]]
    # A tibble: 4 x 2
      ID2   DATE      
      <chr> <date>    
    1 A     2018-02-01
    2 B     2018-02-06
    3 C     2018-02-10
    4 E     2018-04-05
    
    [[5]]
    # A tibble: 4 x 2
      ID2   DATE      
      <chr> <date>    
    1 A     2018-02-01
    2 B     2018-02-06
    3 C     2018-02-10
    4 D     2018-02-21
    
    [[6]]
    # A tibble: 5 x 2
      ID2   DATE      
      <chr> <date>    
    1 A     2018-02-01
    2 B     2018-02-06
    3 C     2018-02-10
    4 D     2018-02-21
    5 E     2018-04-05
    
    >输出
    #一个tibble:6x3
    ID数据ID2
    1 ID_1 A
    2 ID_1 B
    3 ID_1 C
    4id_1d
    5 ID_1 E
    6 ID_1 F
    >输出%>%
    +拉动(数据)
    [[1]]
    #一个tibble:4x2
    ID2日期
    1B 2018-02-06
    2 C 2018-02-10
    2018年2月21日第3天
    4E 2018-04-05
    [[2]]
    #一个tibble:4x2
    ID2日期
    1A 2018-02-01
    2 C 2018-02-10
    2018年2月21日第3天
    4E 2018-04-05
    [[3]]
    #一个tibble:4x2
    ID2日期
    1A 2018-02-01
    2b 2018-02-06
    2018年2月21日第3天
    4E 2018-04-05
    [[4]]
    #一个tibble:4x2
    ID2日期
    1A 2018-02-01
    2b 2018-02-06
    3 C 2018-02-10
    4E 2018-04-05
    [[5]]
    #一个tibble:4x2
    ID2日期
    1A 2018-02-01
    2b 2018-02-06
    3 C 2018-02-10
    4D 2018-02-21
    [[6]]
    #一个tibble:5x2
    ID2日期
    1A 2018-02-01
    2b 2018-02-06
    3 C 2018-02-10
    4D 2018-02-21
    5 E 2018-04-05
    
    当你说
    data[[ID2]]时,你可以使用
    map
    !=df$ID2
    这是否意味着
    data[[ID2]]
    的第一个元素可以在
    df$ID2
    中的任何地方?第二个、第三个等都可以使用
    map(函数(x,y){!x[[ID2]%y[[ID2]},df$data,list(df))
    @RuiBarradas关于你的问题OP应该说最后一句话,但那样所有的数据都会被过滤掉。你应该更具体地了解所需的输出,但类似于下面的内容,过滤掉嵌套列中有
    “A”作为
    ID2
    的行:
    df%>%mutate(filtered=map(data,~filter(,ID2!=“A”))
    很漂亮。我试着把它弄对,但走的是
    unlist()
    路线。