我有一个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
至少一次),而不是细胞响应时。
提前感谢您对此有任何帮助!
答案 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"