如何仅在data.frame中包含感兴趣的值时才返回列标题?

如何仅在data.frame中包含感兴趣的值时才返回列标题?,r,rgui,R,Rgui,我有一个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

我有一个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、X7
X8
输出,但排除所有其他输出

在上下文中,
TRUE
表示细胞在特定时间点对刺激作出反应。我只需要知道单元格是否响应(即列中至少存在一次
TRUE
),而不需要知道单元格何时响应

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

试试看:

colnames(M)[colSums(M) >= 1]
> names(ddf)[sapply(ddf, any)]
[1] "X4" "X6" "X7" "X8"
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"
M试试:


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

> unique(colnames(m)[col(m)[m]])
[1] "X4" "X6" "X7" "X8"
或者您可以在
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"

您显示的内容看起来不像data.frame。请使用正确的术语。谢谢!这很好用。是的,我指的是矩阵,而不是数据框架——我是一名生物学家,但还是会把术语稍微去掉一点。对不起!