如果只包含感兴趣的值,我怎样才能在data.frame中返回列标题?

时间:2014-11-04 16:02:27

标签: r rgui

我有一个data.frame,其中包含多个由TRUEFALSE逻辑答案组成的列,如下所示:

>` .    X1    X2    X3    X4    X5    X6    X7    X8
 [1,] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE
 [2,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
 [3,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [4,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [5,] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
 [6,] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
 [7,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
`

我试图仅提取TRUE存在的列的标题。例如,我会将X4, X6, X7X8排除在外,但排除所有其他人。

对于上下文,TRUE表示细胞正在响应该特定时间点的刺激。我只需要知道细胞是否完全响应(即列中存在TRUE至少一次),而不是细胞响应时。

提前感谢您对此有任何帮助!

3 个答案:

答案 0 :(得分:2)

尝试:

colnames(M)[colSums(M) >= 1]

colSums会将TRUE值相加,然后可以将其与值1进行比较以提取列名称。

示例:

M <- matrix(FALSE, nrow = 4, ncol = 5, dimnames = list(NULL, paste0("X", 1:5)))
M[cbind(c(1, 2, 3, 4), c(2, 2, 4, 5))] <- TRUE
M
#         X1    X2    X3    X4    X5
# [1,] FALSE  TRUE FALSE FALSE FALSE
# [2,] FALSE  TRUE FALSE FALSE FALSE
# [3,] FALSE FALSE FALSE  TRUE FALSE
# [4,] FALSE FALSE FALSE FALSE  TRUE
colnames(M)[colSums(M) >= 1]
# [1] "X2" "X4" "X5"

无论您处理的是matrix还是data.frame,这种方法都会有效。

答案 1 :(得分:0)

尝试:

> names(ddf)[sapply(ddf, any)]
[1] "X4" "X6" "X7" "X8"

答案 2 :(得分:0)

对于矩阵m,您可以进行一些列索引

> unique(colnames(m)[col(m)[m]])
[1] "X4" "X6" "X7" "X8"

或者您可以使用as.factor

中的col参数
> unique(col(m, as.factor=TRUE)[m])
[1] X4 X6 X7 X8
Levels: X1 X2 X3 X4 X5 X6 X7 X8

最初我认为这是一个矩阵,但现在我发现它可能是一个数据框。因此,这里有两种可能的数据框d

数据框方法
> names(Filter(length, Map(which, d)))
[1] "X4" "X6" "X7" "X8"

另一个。这个没有像上面的Map选项那样使用循环

> names(d)[intersect(seq(d), col(d)[unlist(d)])]
[1] "X4" "X6" "X7" "X8"