在R数据帧或向量中查找非数字数据

sta*_*010 18 r dataframe

我用read.csv()阅读了一些冗长的数据,令我惊讶的是数据是作为因子而不是数字出现的,所以我猜测数据中必须至少有一个非数字项.我怎样才能找到这些物品的位置?

例如,如果我有以下数据框:

df <- data.frame(c(1,2,3,4,"five",6,7,8,"nine",10))
Run Code Online (Sandbox Code Playgroud)

我想知道第5行和第9行有非数字数据.我该怎么办?

Ben*_*ker 25

df <- data.frame(c(1,2,3,4,"five",6,7,8,"nine",10))
Run Code Online (Sandbox Code Playgroud)

诀窍是知道转换为数字via as.numeric(as.character(.))会将非数字转换为NA.

which(is.na(as.numeric(as.character(df[[1]]))))
## 5 9
Run Code Online (Sandbox Code Playgroud)

(只是使用as.numeric(df[[1]])不起作用 - 它只是删除数字代码的级别).

您可以选择禁止警告:

which.nonnum <- function(x) {
   which(is.na(suppressWarnings(as.numeric(as.character(x)))))
}
which.nonnum(df[[1]])
Run Code Online (Sandbox Code Playgroud)

为了更加小心,您还应该在转换前检查值是否为NA:

which.nonnum <- function(x) {
   badNum <- is.na(suppressWarnings(as.numeric(as.character(x))))
   which(badNum & !is.na(x))
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么不能使用`is.numeric()`? (2认同)

Flo*_*ian 5

另一种方法是检查向量中的哪些条目包含数字以外的任何字符:

df <- data.frame(c(1,2,3,4,"five",6,7,8,"nine",10))
which(!grepl('^[0-9]',df[[1]]))
## 5 9 
Run Code Online (Sandbox Code Playgroud)

  • 正则表达式中的插入符号应该位于字符类内。另外,您可以考虑将正则表达式更改为“[^0-9.]”以允许小数。 (2认同)