2016-04-08 37 views
-1

以下数据集:提取塔值

df <- read.table(text = " a b c 
       X Y Z", header = T) 

命令

df[, sapply (df[1, ], as.character) %in% c("Y", "X")] 

回报

a b 
1 X Y 

但命令

df[, sapply (df[1, ], as.character) %in% c("Y")] 

回报

[1] Y 
Levels: Y 

,而不是

b 
1 Y 

任何想法,为什么?我怎样才能获取正确的列名

+2

使用'下降= FALSE'在'[.data.frame',即'DF [,sapply(DF [1],as.character )%c(“Y”),drop = FALSE]' – jogo

+2

相关,(可能重复)http://stackoverflow.com/questions/36499666/subsetting-datafram-based-on-row-value回答@RomanLuštrik – zx8754

+0

[一般禁用矩阵的维度删除?]可能的重复(http://stackoverflow.com/questions/12196724/generally-disable-dimension-dropping-for-matrices) – jogo

回答

2

有可能是重复的...但提供一个答案......

你已经掉进了R Inferno; 8.1.44的主要陷阱之一,其中“通过默认尺寸当下标使维数长度为1时,数组将被删除。使用drop = FALSE进行下标将覆盖默认值。“

所以,这将返回你所期望的:

df[, sapply (df[1, ], as.character) %in% c("Y"), drop = FALSE]