2017-11-14 10 views
1

非常に新しくR 多数の列を持つ非常に大きなデータフレーム(効率のためにループを使用しないようにする)があります。私は文字のベクトル(ex c( '9515'、 '8231'))に対して複数の列(ex ss1:ss15)をスキャンしたいと思う。これらのいずれかが真であるか一致している場合は、その行のいずれかが真であれば値1、そうでなければ0でデータフレームに新しい列を取得しようとしています。私は、単一のlogicalに論理vector秒のlistをINGの私たちは、Reduce、その後、データセットをサブセット化によって、関心の列をループすることで、grepを使用するか...複数の列で複数の値を検索する

+3

'as.integer(Reduce( '|'、lapply(df1 [cols]、grepl、pattern = paste(vect、collapse =" | "))))'または固定マッチの場合 'as.integer(Reduce '|'、lapply(df1 [cols]、 '%in%'、vect))) ' – akrun

+1

すごい、あなたは私にそんなに心苦しい苦労を救ったあなた、ありがとう – Ophelie

答えて

0

も、このついて行く開始する方法についてこだわっています続いて、サブストリングベクトルと検索対象の「VECT」要素が固定されている場合as.integer

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

のバイナリに変換するとしない、我々はまた、%in%

を使用することができ
as.integer(Reduce('|', lapply(df1[cols], '%in%', vect))) 
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 ]