2014-11-04 51 views
2

我有一個包含組成的TRUEFALSE邏輯的答案多個列data.frame,像這樣:只有當它包含感興趣的值時,我如何才能返回data.frame中的列標題?

>` . 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一次),而不是單元格響應。

在此先感謝您的幫助!

+0

你顯示的內容看起來不像data.frame。請使用正確的術語。 – Roland 2014-11-04 16:06:23

回答

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" 

這種方法將工作無論您是處理一個matrixdata.frame

+0

謝謝你!這工作完美。是的,我的意思是矩陣,而不是數據框架 - 我是一名生物學家,並且仍然對這個術語感到遺憾! – Kevin 2014-11-06 13:22:41

0

嘗試:

> names(ddf)[sapply(ddf, any)] 
[1] "X4" "X6" "X7" "X8" 
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" 
相關問題