我用read.csv()阅读了一些冗长的数据,令我惊讶的是数据是作为因素而不是数字出现的,所以我猜测数据中必须至少有一个非数字项。我怎样才能找到这些物品的位置?
例如,如果我有以下数据框:
df <- data.frame(c(1,2,3,4,"five",6,7,8,"nine",10))
我想知道第5行和第9行有非数字数据。我该怎么做?
答案 0 :(得分:22)
df <- data.frame(c(1,2,3,4,"five",6,7,8,"nine",10))
诀窍是知道通过as.numeric(as.character(.))
转换为数字会将非数字转换为NA
。
which(is.na(as.numeric(as.character(df[[1]]))))
## 5 9
(仅使用as.numeric(df[[1]])
不起作用 - 只会丢弃数字代码的级别)。
您可以选择取消警告:
which.nonnum <- function(x) {
which(is.na(suppressWarnings(as.numeric(as.character(x)))))
}
which.nonnum(df[[1]])
为了更加小心,您还应该在转换前检查值是否为NA:
which.nonnum <- function(x) {
badNum <- is.na(suppressWarnings(as.numeric(as.character(x))))
which(badNum & !is.na(x))
}
答案 1 :(得分:2)
另一种方法是检查向量中的哪些条目包含除数字以外的任何字符:
df <- data.frame(c(1,2,3,4,"five",6,7,8,"nine",10))
which(!grepl('^[0-9]',df[[1]]))
## 5 9