如何确定强制将NA添加到哪一列

时间:2018-10-08 03:40:32

标签: r coercion

我正在尝试确定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的哪些列(甚至更具体地为行和列)?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

我们可以将whicharr.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"