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