R:处理包含字符串和布尔值的数据帧

R:处理包含字符串和布尔值的数据帧,r,R,我在R中有一个data.frame;它叫p。data.frame中的每个元素都是True或False。我的变量p有m行和n列。对于每一行,严格来说只有一个TRUE元素 它还有列名,即字符串。我想做的是: 对于p中的每一行,我看到一个TRUE我想用相应列的名称替换 然后我想将data.frame(现在包含FALSEs和列名)折叠为一个向量,该向量将包含m个元素 我想以一种R-thonic的方式来做这件事,以便继续我在R中的启蒙,并为一个没有for循环的世界做出贡献 我可以使用以下for循环执行步骤

我在R中有一个data.frame;它叫
p
。data.frame中的每个元素都是True或False。我的变量
p
有m行和n列。对于每一行,严格来说只有一个
TRUE
元素

它还有列名,即字符串。我想做的是:

  • 对于
    p
    中的每一行,我看到一个
    TRUE
    我想用相应列的名称替换
  • 然后我想将data.frame(现在包含
    FALSE
    s和列名)折叠为一个向量,该向量将包含m个元素
  • 我想以一种R-thonic的方式来做这件事,以便继续我在R中的启蒙,并为一个没有for循环的世界做出贡献
  • 我可以使用以下for循环执行步骤1:

    for (i in seq(length(colnames(p)))) {
        p[p[,i]==TRUE,i]=colnames(p)[i]
    }
    
    但是这里没有什么美,我完全赞同这种可能是错误的想法。也许错误太强烈了,但它们肯定不是伟大的


    我真的不知道怎么做第二步。我有点希望字符串和
    FALSE
    的和会返回字符串,但它没有返回。我有点希望我可以使用某种OR运算符,但不能完全理解(Python用
    'bob'
    响应
    False或'bob'
    )。因此,我再次呼吁你们这些美丽的国家人民给予帮助

    以下是一些示例数据:

    df <- data.frame(a=c(FALSE, TRUE, FALSE), b=c(TRUE, FALSE, FALSE), c=c(FALSE, FALSE, TRUE))
    
    或者不使用
    直接使用
    应用

    idx <- which(as.matrix(df), arr.ind=T)
    names(df)[idx[order(idx[,1]),"col"]]
    

    idx使用
    apply
    浏览索引,并使用该索引访问列名:

    > df <- data.frame(a=c(TRUE,FALSE,FALSE),b=c(FALSE,FALSE,TRUE),
    +                  c=c(FALSE,TRUE,FALSE))
    > df
          a     b     c
    1  TRUE FALSE FALSE
    2 FALSE FALSE  TRUE
    3 FALSE  TRUE FALSE
    > colnames(df)[apply(df, 1, which)]
    [1] "a" "c" "b"
    > 
    
    >测向
    a、b、c
    1真假假假
    2假假假真
    3假真假
    >colnames(df)[应用(df,1,which)]
    [1] “a”“c”“b”
    > 
    
    Wow。我们又一次在同一时间独立地得出了大致相同的解决方案。甚至数据!你赢了五分钟,但我使用真/假而不是非常淘气和气馁的T/F得到了更高的技术分数:)显然,我应该得到绿色的勾号,因为我给出了两个解决方案。:)嗯,我觉得你的第二个解决方案有问题!它不会在一列中处理多个TRUEs,而共享解决方案会处理这个细节。使用
    df Good catch比较输出。我刚刚纠正了这一点。让我们知道哪些方法在您的数据集上表现更好?我已经老了。你领先我五分钟;-)见德克解决方案下的评论!第二种方法给出的响应与第一种方法不同。。
    
    > df <- data.frame(a=c(TRUE,FALSE,FALSE),b=c(FALSE,FALSE,TRUE),
    +                  c=c(FALSE,TRUE,FALSE))
    > df
          a     b     c
    1  TRUE FALSE FALSE
    2 FALSE FALSE  TRUE
    3 FALSE  TRUE FALSE
    > colnames(df)[apply(df, 1, which)]
    [1] "a" "c" "b"
    >