数据框的子集行,其中包含所有列中的数字

时间:2017-07-07 14:03:34

标签: r subset

我希望通过保留所有列中包含数字的行来获取数据框的子集

>small
     0    16h    24h    48h
ID1  1    0      0   
ID2  453  254    21     12  
ID3  true  3     2      1
ID4  65    23    12     12

将是

>small_numeric
     0    16h    24h    48h  
ID2  453  254    21     12  
ID4  65    23    12     1

我试过

sapply(small, is.numeric)

但得到了这个

0      16h    24h    48h   
FALSE  FALSE  FALSE  FALSE 

1 个答案:

答案 0 :(得分:5)

使用:

small[!rowSums(is.na(sapply(small, as.numeric))),]

给出:

      0 16h 24h 48h
ID2 453 254  21  12
ID4  65  23  12  12

这是做什么的:

  • 使用sapply(small, as.numeric)强制所有列都为数字。非数字值将转换为NA - 值。
  • 接下来,您使用NA计算rowSums(is.na(sapply(small, as.numeric))) - 值的数量,这会使您返回一个数字向量[1] 1 0 1 0,其中包含按行显示的非数字值。
  • 使用!取消它会为您提供所有列都具有数值的行的逻辑向量。

使用过的数据:

small <- read.table(text="     0    16h    24h    48h
ID1  1    0      0     
ID2  453  254    21     12  
ID3  true  3     2      1
ID4  65    23    12     12", header=TRUE, stringsAsFactors = FALSE, fill = TRUE, check.names = FALSE)

对于更新的示例数据,问题是具有非数字值的列是因子而不是字符。在那里,您必须按照以下方式调整上述代码:

testdata[!rowSums(is.na(sapply(testdata[-1], function(x) as.numeric(as.character(x))))),]

给出:

      0  16h  24h  48h   NA
ID2 ID2   46   23   23   48
ID3 ID3   44   10   14   22
ID4 ID4   17   11    4   24
ID5 ID5   13    5    3   18
ID7 ID7 4387 4216 2992 3744

额外解释:

  • 将因子列转换为数字时,您必须先将这些列转换为字符。因此:as.numeric(as.character(x))。如果你不这样做,as.numeric会给出因子级别的数字。
  • 我使用了testdata[-1]因为我认为你不想在检查中包含数字值的第一列。