2

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

>` .    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至少存在于列中一次),而不是单元格何时响应。

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

4

3 回答 3

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"

无论您处理的是 amatrix还是data.frame.

于 2014-11-04T16:05:44.930 回答
0

尝试:

> names(ddf)[sapply(ddf, any)]
[1] "X4" "X6" "X7" "X8"
于 2014-11-04T16:09:41.227 回答
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"
于 2014-11-04T16:16:15.637 回答