【问题标题】:R: manipulating data.frames containing strings and booleansR:操作包含字符串和布尔值的data.frames
【发布时间】:2010-04-22 01:23:57
【问题描述】:

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

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

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

我可以使用以下 for 循环执行第 1 步:

for (i in seq(length(colnames(p)))) {
    p[p[,i]==TRUE,i]=colnames(p)[i]
}

但这里没有美感,我完全赞同这种 for-loops-in-R-are-probably-wrong 的心态。也许错误太强了,但它们肯定不是很好。

我真的不知道如何执行第 2 步。我有点希望字符串和 FALSE 的总和会返回字符串,但事实并非如此。我有点希望我可以使用某种 OR 运算符,但不能完全弄清楚(Python 用 'bob' 响应 False or 'bob')。因此,我再次向你们美丽的 Rstats 人求助!

【问题讨论】:

    标签: r


    【解决方案1】:

    以下是一些示例数据:

    df <- data.frame(a=c(FALSE, TRUE, FALSE), b=c(TRUE, FALSE, FALSE), c=c(FALSE, FALSE, TRUE))
    

    您可以使用apply 执行以下操作:

    names(df)[apply(df, 1, which)]
    

    或者直接使用which而不使用apply

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

    【讨论】:

    • 我老了。你比我多五分钟 ;-)
    • 查看 Dirk 解决方案下的评论!第二种方法与第一种方法的响应不同..
    【解决方案2】:

    使用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"
    > 
    

    【讨论】:

    • 哇。然而,我们又一次独立地同时提出了大致完全相同的解决方案。甚至是数据!
    • 你赢了五分钟,但我使用 TRUE/FALSE 而不是非常顽皮和气馁的 T/F 获得了更高的技术分数 :)
    • 很明显,我应该得到绿色勾号,因为我给出了 两个 解决方案。 :)
    • 嗯。我认为您的第二个解决方案有问题!它不处理一列中的多个 TRUE,而共享解决方案可以处理这个问题。使用df &lt;- data.frame(a=c(FALSE, TRUE, FALSE, TRUE), b=c(TRUE, FALSE, FALSE, FALSE), c=c(FALSE, FALSE, TRUE, FALSE)) 比较输出 - 您认为哪个是合适的行为?
    • 好收获。我刚刚纠正了这一点。让我们知道哪些方法在您的数据集上表现更好?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    相关资源
    最近更新 更多