在data.frame列中找到第一个值[R]

时间:2014-12-03 13:29:34

标签: r

我试图将一列的值与其他几列相匹配,并创建一个逻辑矩阵,其中包含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

提前致谢!

1 个答案:

答案 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