【问题标题】:Search multiple columns for multiple values在多个列中搜索多个值
【发布时间】:2017-11-14 11:51:54
【问题描述】:

对 R 非常陌生 拥有一个包含许多列的非常大的数据框(即避免使用循环来提高效率)。我想扫描多个列(例如 ss1:ss15)以查找字符向量(例如 c('9515','8231'))。如果其中任何一个为真/匹配,我将尝试在数据框中获取一个新列,如果该行中的任何一个为真,则值为 1,否则为 0。我被困在如何开始这件事上……

【问题讨论】:

  • as.integer(Reduce('|', lapply(df1[cols], grepl, pattern = paste(vect, collapse="|")))) 或者如果是固定匹配 as.integer(Reduce('|', lapply(df1[cols], '%in%', vect)))
  • 太棒了,你救了我这么多痛苦的挣扎,谢谢

标签: r


【解决方案1】:

我们可以使用grep,通过子集数据集循环遍历感兴趣的列,然后Reduce将逻辑vectors 的list 转换为单个logical 向量,然后转换为二进制as.integer

cols <- paste0('ss', 1:15)
vect <- c(‘9515’,’8231’)
as.integer(Reduce('|', lapply(df1[cols], grepl, pattern = paste(vect, collapse="|"))))

如果要搜索的'vect'元素是固定的而不是子字符串,我们也可以使用%in%

as.integer(Reduce('|', lapply(df1[cols], '%in%', vect))) 

【讨论】:

    【解决方案2】:

    使用 magrittr 和 data.tables 并允许操作中间矩阵的替代方法:

    library ( "magrittr" )
    vect = c ( "9515", "8231" )
    
    # Creating the data table
    N <- 150
    dt1 <- matrix (
        sample ( c ( vect, "other" ), N, prob = c ( .05, .05, .9 ), replace = TRUE ),
        ncol = 15, dimnames = list ( NULL, paste0 ( "ss", 1:15 ))) %>% as.data.table
    
    # Initiatilzing the new column
    dt1 [, NewCol := rep ( 0, N / 15 )]
    
    # Define query function
    InVect <- function ( x ) x %in% vect
    
    # Querying the data table
    dt1 [( apply ( dt1, 1:2, InVect ) %>% which ( arr.ind = TRUE ))[, 1 ] %>%
      unique, NewCol := 1 ]
    dt1
    

    ,以及另一种循环 vect 的方式(在某些情况下可能有优点):

    # Initiatilzing the new column
    dt1 [, NewCol := rep ( 0, N / 15 )]
    
    # Define query function
    RowIDs <- function ( x ) ( which ( dt1 == x, arr.ind = TRUE ))[, 1 ]
    
    # querying the data table
    dt1 [ lapply ( vect, RowIDs ) %>% unlist %>% unique, NewCol := 1 ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      • 2020-06-27
      相关资源
      最近更新 更多