我正在尝试确定NA被强制添加到了哪些列。特别是如果我有一个非常大的数据表。以较小的表格为例,将表格从字符转换为数字(从Excel工作表读取)。
clean_tab数据:
A tibble: 3 x 3
a b c
<dbl> <chr> <chr>
1 0.5 4-2 5
2 0.1 0.29999999999999999 3-1
3 0.3 0.40000000000000002 4
应用于数据的代码:
b <- c(1,2,3)
clean_tab[, b] <- sapply(clean_tab[, b], as.numeric)
View(clean_tab)
结果警告消息和输出:
Warning messages:
1: In lapply(X = X, FUN = FUN, ...) : NAs introduced by coercion
2: In lapply(X = X, FUN = FUN, ...) : NAs introduced by coercion
> clean_tab
# A tibble: 3 x 3
a b c
<dbl> <dbl> <dbl>
1 0.5 NA 5
2 0.1 0.3 NA
3 0.3 0.4 4
在这种情况下,因为它是一个较小的表,所以我可以清楚地看到NA的添加位置。如果表很大,我如何确定添加了NA的哪些列(甚至更具体地为行和列)?
感谢您的帮助。
答案 0 :(得分:2)
我们可以将which
与arr.ind
一起使用,以返回NA
元素的行/列索引
which(is.na(clean_tab), arr.ind = TRUE)
# row col
#1 1 2
#2 2 3
由于输入数据是tibble
,我们可以利用tidyverse
的方法进行转换
library(tidyverse)
library(magrittr)
clean_tab %<>%
mutate_at(b, as.numeric)
clean_tab <- structure(list(a = c(0.5, 0.1, 0.3), b = c("4-2",
"0.29999999999999999", "0.40000000000000002"),
c = c("5", "3-1", "4")), row.names = c("1",
"2", "3"), class = c("tbl_df", "tbl", "data.frame"))
答案 1 :(得分:0)
一种方法可能是尝试将每一列转换为数字,然后断言是否有任何NA
值是由于该尝试而产生的:
df <- data.frame(a=c(0.5, 0.1, 0.3),
b=c("4-2", "0.29999999999999999", "0.40000000000000002"),
c=c("5", "3-1", "4"), stringsAsFactors=FALSE)
names(df)[sapply(df, function(x) { sum(is.na(as.numeric(x))) > 0 })]
[1] "b" "c"