R:操纵包含字符串和布尔值的data.frames

时间:2010-04-21 16:24:59

标签: r

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

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

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

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

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

    我真的不知道如何做第2步。我希望字符串和FALSE的总和会返回字符串,但事实并非如此。我希望我可以使用某种类型的OR运算符,但不能完全弄明白(Python使用False or 'bob'响应'bob')。因此,再一次,我呼吁你们美丽的Rstats人们寻求帮助!

2 个答案:

答案 0 :(得分:4)

以下是一些示例数据:

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)]

或直接使用apply时没有which

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

答案 1 :(得分:3)

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