我希望通过在所有列中保留具有数值的行来获取数据的子集,因此
>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 发布于 2017-07-07 14:18:35
使用:
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-values。NA-values和rowSums(is.na(sapply(small, as.numeric)))计算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],因为我假设您不希望在数字值的检查中包括第一列。https://stackoverflow.com/questions/44972786
复制相似问题