我试图将一列的值与其他几列相匹配,并创建一个逻辑矩阵,其中包含FIRST匹配的TRUE和所有其他值的FALSE。
例如,使用以下数据:
var1 <- c("bush", "tree", "tree", "rock")
var2 <- c("tree", "bush", "rock", "rock")
var3 <- c("rock", "tree", "tree", "rock")
var4 <- c("rock", "tree", "tree", "tree")
var5 <- c("bush", "bush", "rock", "tree")
search_term <- c("tree", "tree", "bush", "tree")
df <- data.frame(var1, var2, var3, var4, var5, search_term, stringsAsFactors = FALSE)
> df
var1 var2 var3 var4 var5 search_term
1 bush tree rock rock bush tree
2 tree bush tree tree bush tree
3 tree rock tree tree rock bush
4 rock rock rock tree tree tree
我想寻找&#34; search_term&#34;在var1-var5中,最终创建一个逻辑矩阵,第一个值为TRUE,所有其他值为FALSE。
这样做:
df[, 1:5] == df$search_term
为所有匹配产生一个TRUE的逻辑矩阵:
var1 var2 var3 var4 var5
[1,] FALSE TRUE FALSE FALSE FALSE
[2,] TRUE FALSE TRUE TRUE FALSE
[3,] FALSE FALSE FALSE FALSE FALSE
[4,] FALSE FALSE FALSE TRUE TRUE
我想要得到的东西看起来像这样,只有第一场比赛为TRUE:
var1 var2 var3 var4 var5
[1,] FALSE TRUE FALSE FALSE FALSE
[2,] TRUE FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE FALSE
[4,] FALSE FALSE FALSE TRUE FALSE
提前致谢!
答案 0 :(得分:0)
如果您希望first
条目仅为真
t(apply(df[,1:5]==df$search_term, 1, function(x) {
x[which(x)[-1]] <- FALSE
x}))
# var1 var2 var3 var4 var5
#[1,] FALSE TRUE FALSE FALSE FALSE
#[2,] TRUE FALSE FALSE FALSE FALSE
#[3,] FALSE FALSE FALSE FALSE FALSE
#[4,] FALSE FALSE FALSE TRUE FALSE
另一种选择是
indx <- df[1:5]==df$search_term
indx1 <- !indx+1
indx1[cbind(1:nrow(df), max.col(indx,'first')*!!rowSums(indx))] <- TRUE
indx1
# var1 var2 var3 var4 var5
#[1,] FALSE TRUE FALSE FALSE FALSE
#[2,] TRUE FALSE FALSE FALSE FALSE
#[3,] FALSE FALSE FALSE FALSE FALSE
#[4,] FALSE FALSE FALSE TRUE FALSE