在多个列中搜索多个值

时间:2017-11-14 11:51:54

标签: r

R很新 有许多列有一个非常大的数据框(即希望避免使用循环来提高效率)。我想扫描多个列(ex ss1:ss15)以获取字符向量(ex c('9515','8231'))。如果其中任何一个为真/匹配,我试图在数据框中获取值为1的新列,如果该行中的任何一个为真,则为0。我一直坚持如何开始这个......

2 个答案:

答案 0 :(得分:0)

我们可以使用grep,通过对数据集进行分项来遍历感兴趣的列,然后将Reduce逻辑list的{​​{1}}合并为一个vector {1}}向量,然后使用logical

转换为二进制
as.integer

如果&#39; vect&#39;要搜索的元素是固定的而不是子字符串,我们也可以使用cols <- paste0('ss', 1:15) vect <- c(‘9515’,’8231’) as.integer(Reduce('|', lapply(df1[cols], grepl, pattern = paste(vect, collapse="|"))))

%in%

答案 1 :(得分:0)

替代使用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 ]