【问题标题】:Find first value across data.frame columns [R]跨 data.frame 列查找第一个值 [R]
【发布时间】:2015-02-01 02:10:21
【问题描述】:

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

我想在 var1-var5 中查找“search_term”,并最终创建一个逻辑矩阵,第一个值为 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

提前致谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    如果您希望 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
    

    【讨论】:

    • @dreww2 没问题。很高兴它有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多