Поскольку предполагается, что все поля в кадре равны character
, мы можем рассматривать кадр как matrix
.(Как правило, я не рекомендую использовать apply
с кадрами, поэтому я включаю это ведущее предостережение.)
df <- read.table(header=FALSE, stringsAsFactors=FALSE, text="
car Chevy Honda Toyota
food Ritz Hershey Nestle
shoe Nike UA Reebok")
vec <- c('Toyota','UA','Reebok','Nestle')
Начинаем искать совпадения:
apply(df, 1, function(row) vec %in% row)
# [,1] [,2] [,3]
# [1,] TRUE FALSE FALSE
# [2,] FALSE FALSE TRUE
# [3,] FALSE FALSE TRUE
# [4,] FALSE TRUE FALSE
Теперь мы можем работать надэта результирующая матрица для возврата, которая является первым столбцом в каждой строке:
apply(apply(df, 1, function(row) vec %in% row), 1,
function(a) which(a)[1])
# [1] 1 3 3 2
Теперь нам просто нужно использовать это для индексации первого столбца:
df$V1[ apply(apply(df, 1, function(row) vec %in% row), 1,
function(a) which(a)[1]) ]
# [1] "car" "shoe" "shoe" "food"
Если все являетсяcharacter
(и у вас много данных), вы можете обнаружить, что matrix
быстрее.