我用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)
另一种方法是检查向量中的哪些条目包含数字以外的任何字符:
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)